spi一般是4线(CS、MISO、MOSI、SCK)或者3线(MISO和MOSI线合并),当然这里忽略了设备芯片的电源、地等其他线。
一条spi总线上只有一个master,slave根据片选情况可以有多个,但同一时间只能有一个工作。通过片选cs信号来区分。
这里只关心spi总线的外设,所以不用像spi host controller驱动及内核spi_bus_type那样关心很多spi的细节。
具体协议参见《SPI_motorola_specification.pdf》
注意图中CPHA和CPOL表示什么意思,决定了是哪个沿采样。
需要注意linux对应的mode。
一般外设驱动涉及的内核提供的spi api有:
具体参见include/linux/spi/spi.h
spi_register_driver()、spi_unregister_driver()
struct spi_driver
spi_write()、spi_read()、spi_write_then_read()、spi_sync()、spi_async()、spi_setup()。
struct spi_device
struct spi_message、 spi_message_init()、 spi_message_add_tail()
arm device tree之前的board方式时,spi设备需要你调用spi_register_board_info()来注册。现在的arm device tree,由spi的bus host controller驱动根据你在device tree的spi controller节点中加入的子节点来生成相应的spi设备(通过spi_register_master()调用of_register_spi_devices()进而调用spi_alloc_device()、 spi_add_device ()进行),并注册进相应的spi总线号上(这样struct spi_device和struct spi_master的父子关系就确定了)。
随便搜索其中一个spi函数,即可在驱动中找到很多spi的设备驱动例子。
具体请参考我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html
另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。