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驅動 */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章