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驱动 */