RT-Thread SPI设备驱动使用

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

发布了35 篇原创文章 · 获赞 22 · 访问量 1156

猜你喜欢

转载自blog.csdn.net/m0_37845735/article/details/103245675