SPI总线以及驱动详解
SPI总线有四根线,一根是MISO主机输入从机输出,一根是MOSI主机输出从机输入,一根是CLK时钟线,一根是CS片选线
片选线用来选择和哪个从机进行通信
SPI总线在进行数据传输的时候,先传送数据高位,再传送数据低位,数据线高电平表示1,低电平表示0,传送一个字节完成后无需应答,就可以传送下一个字节
数据传送有四种工作方式:
取决于时钟极性和时钟相位,时钟极性CPOL 0时钟起始位低电平 1时钟起始位高点平
时钟相位CPHA 0第一个时钟周期采样 1第二个时钟周期采样
00 起始电平为低电平—>数据采样(读数据)在第一个边沿,时钟线从低到高跳变的时候,数据线保持不变,这时候读数据,时钟线从高到底跳变的时候,数据线可以变化,发送数据,所以上升沿读,下降沿写
01 起始电平为低电平—>数据采样(读数据)在第二个边沿,时钟线从低到高跳变的时候,数据线可以变化,发送数据,时钟线从高到底跳变的时候,数据线保持不变,这时候读数据,所以上升沿写,下降沿读
10 起始电平是高点平—>数据采样(读数据)在第一个边沿,时钟线从高到低跳变的时候,数据线保持不变,这时候读数据,时钟线从低到高跳变的时候,数据线可以变化,发送数据,所以,下降沿读,上升沿写
11 起始电平是高点平—>数据采样(读数据)在第二个边沿,时钟线从高到低跳变的时候,数据线可以变化,发送数据,时钟线从低到高跳变的时候,数据线保持不变,这时候读数据,所以,下降沿写,上升沿读
一共四种传输方式
特点:
一个主机,多个从机,从机依据片选线选择
串行,数据只能一位一位的发
全双工:同一时刻可以双向通信,因为有两根数据线
同步:因为有时钟线
非差分
高速:没有应答机制
API:
分配对象
struct spi_drivers{
probe
remove
struct device_drivers
}
struct device_drivers{
name = "不用来匹配,但是必须填"
struct of_device_id *if_match_table
}
struct of_device_id{
{.compatible = "hqyj,m74hc595",},
{}
}
一键注册注销
module_spi_drivers(变量名)
设备树:
&spi4 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&spi4_pins_b>;
pinctrl-1 = <&spi4_sleep_pins_b>;两种状态
cs-gpios = <&gpioe 11 0>; 片选线加上
status = "okay";使能
m74hc595@0 {
compatible = "hqyj,m74hc595";
reg = <0>; //片选编号
spi-max-frequency = <10000000>; //10MHZ
};
};
在根节点的外面引用spi节点,子节点包含在里面