RT-Thread SPI設備驅動使用
使用流程
1、註冊spi總線到系統中
int rt_hw_spi_init(void)
{
stm32_get_dma_info();
return rt_hw_spi_bus_init();
}
INIT_BOARD_EXPORT(rt_hw_spi_init);
這裏已經使用rt_hw_spi_init自動將選擇的spi總線註冊到了系統中,所以不再需要手冊註冊。函數調用流程爲:
rt_hw_spi_bus_init()--->
/* register a SPI bus */
rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus,
const char *name,
const struct rt_spi_ops *ops) --->
/*將spi總線定義爲RT_Device_Class_SPIBUS類型註冊到系統中*/
rt_err_t rt_spi_bus_device_init(struct rt_spi_bus *bus, const char *name)
2、註冊spi設備到系統中,並附加到一個spi總線上,函數調用流程爲:
/** 1、調用rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin)
2、attach a device on SPI bus
*/
rt_err_t rt_hw_spi_device_attach(const char *bus_name,
const char *device_name,
GPIO_TypeDef *cs_gpiox,
uint16_t cs_gpio_pin) -->
/** 1、根據bus_name找到spi_bus設備
2、將spi_bus設備賦值給spi_dev設備的bus
3、調用rt_spidev_device_init
4、將user_data賦值給device->parent.user_data
struct rt_spi_device
{
struct rt_device parent;
struct rt_spi_bus *bus;
struct rt_spi_configuration config;
void *user_data;
};
*/
rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device,
const char *name,
const char *bus_name,
void *user_data)-->
/*將spi_dev設備RT_Device_Class_SPIDevice註冊到系統中*/
rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name)
使用示例:rt_hw_spi_device_attach(“spi1”,“spi10”,GPIOA,GPIO_PIN_5);
3、註冊FLASH設備到系統中,並附加到一個spi設備上
struct spi_flash_device
{
struct rt_device flash_device;
struct rt_device_blk_geometry geometry;
struct rt_spi_device * rt_spi_device;
struct rt_mutex lock;
void * user_data;
};
/** 1、根據spi_device_name找到spi_dev設備
2、將spi_dev設備賦值給spi_flash_device設備的rt_spi_device
3、將spi_flash_device設備RT_Device_Class_SPIDevice註冊到系統中
*/
rt_err_t w25qxx_init(const char * flash_device_name, const char * spi_device_name)
使用示例:
1、w25qxx_init(“w25q128”,“spi10”); /* 使用spi_flash_w25qxx驅動 /
2、rt_sfud_flash_probe(“w25q128”,“spi10”); / 使用spi_flash_sfud驅動 */