久久精品国产精品国产一区,少妇扒开毛毛自慰喷水,国产精品无码电影在线观看 ,久久天天躁夜夜躁狠狠85麻豆

思澈科技軟件開發(fā)工具包  2.20
SPI

SPI驅(qū)動(dòng)包括兩層:硬件訪問(wèn)層(HAL)和RT-Thread的適配層。
硬件訪問(wèn)層提供用于訪問(wèn) SPI 外設(shè)寄存器的基本 API。 有關(guān)詳細(xì)信息,請(qǐng)參閱 SPI HAL 的 API 文檔。
適配層提供對(duì) RT-Thread 驅(qū)動(dòng)框架的支持。 用戶可以使用 RT-Thread POSIX 驅(qū)動(dòng)程序接口進(jìn)行 SPI 編程。 請(qǐng)參閱 RT-Thread 驅(qū)動(dòng)程序的 API 文檔。
主要功能包括:

  • 多實(shí)例支持
  • 支持SPI工作在主模式或從模式
  • 支持SPI速度高達(dá)24Mbps
  • 支持 3 線或 4 線 SPI 工作
  • 支持基于中斷的 RX 和 TX
  • RX 和 TX 均支持 DMA

驅(qū)動(dòng)配置

SPI 驅(qū)動(dòng)程序可以使用多個(gè) SPI 外設(shè)實(shí)例。 可以使用 menuconfig 工具為每個(gè)項(xiàng)目選擇外設(shè)和 DMA 支持配置的實(shí)例,通常保存在 C 頭文件中。 默認(rèn)情況下,配置保存為 rtconfig.h。

以下示例顯示在一個(gè)項(xiàng)目頭文件中定義的標(biāo)志,該項(xiàng)目使用具有 DMA 支持的 spi1/spi2 實(shí)例:

#define RT_USING_SPI
#define BSP_USING_SPI
#define BSP_USING_SPI1
#define BSP_USING_SPI2
#define BSP_SPI1_TX_USING_DMA
#define BSP_SPI1_RX_USING_DMA
#define BSP_SPI2_TX_USING_DMA
#define BSP_SPI2_RX_USING_DMA

配置完成后,用戶需要在所有需要訪問(wèn)驅(qū)動(dòng)程序的源代碼中包含頭文件。

使用 SPI 驅(qū)動(dòng)程序

適配器層注冊(cè) RT-Thread 請(qǐng)求的硬件支持功能,并使用 HAL 實(shí)現(xiàn)這些功能。 對(duì)于 SPI HAL 公開的 API,請(qǐng)參考 SPI。 對(duì)于使用 RT-Thread 的用戶,可以使用以下代碼作為示例:

// Find and open device
rt_device_t rt_device_find(const char *name);
name: spi1 / spi2
rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name);
bus_name: spi1 / spi2
rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag);
oflag: dma mode: RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_DMA_RX|RT_DEVICE_FLAG_DMA_TX
int mode: RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_INT_RX|RT_DEVICE_FLAG_INT_TX
normal mode: RT_DEVICE_FLAG_RDWR
// Configure SPI
rt_err_t rt_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)
cfg: use struct rt_spi_configuration as following:
struct rt_spi_configuration
{
rt_uint8_t mode;
rt_uint8_t data_width;
rt_uint16_t frameMode;
rt_uint32_t max_hz;
};
// RX/TX
rt_size_t rt_spi_transfer(struct rt_spi_device *device,
const void *send_buf,
void *recv_buf,
rt_size_t length);
// Interrupt callback, try not issue read in interrupt context.
// example
void spi_trans_test()
{
rt_device_t spi_bus = RT_NULL;
struct rt_spi_device *spi_dev = RT_NULL;
struct rt_spi_configuration cfg;
rt_err_t err_code;
rt_uint8_t *rx_buff = RT_NULL;
rt_uint8_t *tx_buff = RT_NULL;
spi_bus = rt_device_find("spi1");
if (RT_NULL == spi_bus)
{
return;
}
spi_dev = (struct rt_spi_device *)rt_device_find("spi1_dev");
if (RT_NULL == spi_dev)
{
err_code = rt_hw_spi_device_attach("spi1", "spi1_dev");
if (RT_EOK != err_code)
{
return;
}
spi_dev = (struct rt_spi_device *) rt_device_find("spi1_dev");
}
if (RT_NULL == spi_dev)
{
return;
}
err_code = rt_device_open(&(spi_dev->parent), RT_DEVICE_FLAG_RDWR);
if (RT_EOK != err_code)
{
return;
}
cfg.data_width = 8;
cfg.max_hz = 4000000;
//frame_mode, //b0:SPO b1:SPH b2:moto(spi) b3:ti(ssi) b4:microwire
//cfg.mode = RT_SPI_MODE_1 | RT_SPI_MSB;
cfg.mode = RT_SPI_MSB | RT_SPI_MASTER | RT_SPI_MODE_1;
cfg.frameMode = RT_SPI_MOTO;
err_code = rt_spi_configure(spi_dev, &cfg);
uassert_int_equal(RT_EOK, err_code);
err_code = rt_spi_take_bus(spi_dev);
uassert_int_equal(RT_EOK, err_code);
err_code = rt_spi_take(spi_dev);
uassert_int_equal(RT_EOK, err_code);
rx_buff = rt_malloc(rw_len + 2);
tx_buff = rt_malloc(rw_len + 2);
uassert_true((RT_NULL != tx_buff) && (RT_NULL != rx_buff));
if ((RT_NULL != tx_buff) && (RT_NULL != rx_buff))
{
for (int m = 0; m < rw_len; m++)
{
tx_buff[m] = m;
}
memset(rx_buff, 0x5a, rw_len + 2);
rt_spi_transfer(spi_dev, tx_buff, rx_buff, rw_len / (data_size / 8));
}
if (RT_NULL != tx_buff)
{
rt_free(tx_buff);
}
if (RT_NULL != rx_buff)
{
rt_free(rx_buff);
}
err_code = rt_spi_release(spi_dev);
uassert_int_equal(RT_EOK, err_code);
err_code = rt_spi_release_bus(spi_dev);
uassert_int_equal(RT_EOK, err_code);
err_code = rt_device_close(&(spi_dev->parent));
uassert_true_ret(RT_EOK == err_code);
}
Note
DMA 支持是通過(guò) menuconfig 工具配置的,要使用 DMA,開發(fā)者需要在打開設(shè)備時(shí)設(shè)置相應(yīng)的標(biāo)志。
HAL_SPI_TxRxCpltCallback
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
Tx and Rx Transfer completed callback.
__SPI_HandleTypeDef
SPI handle Structure definition.
Definition: bf0_hal_spi.h:151
HAL_SPI_ErrorCallback
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
SPI error callback.
HAL_SPI_RxCpltCallback
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
Rx Transfer completed callback.
HAL_SPI_TxCpltCallback
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
Tx Transfer completed callback.