60 spi通信协议
SPI(Serial Peripheral Interface–串行外围接口), 由摩托罗拉公司发明.
SPI的接口组成:
数据线,每个时钟周期传输一位数据:
MOSI: master output slave input(主机输出,从机输入)
MISO: master input slave output(主机输入,从机输出)
//两根数据实现全双工数据传输
时钟线:
SPICLK: 提供时钟信号,每个信号周期收发一位数据
片选线:
SPICS: 通常片选线低电平,所连的SPI设备就处于工作状态,如是高电平,则连接的SPI设备停止工作
////////////////////主机与从机的连接//////////
master: slave:
cs <------------> cs
spiclk <------------> clk
miso <------------> miso(so)
mosi <------------> mosi
//注意不用交叉接
/////////////////// spi 的工作时序方式有4种//////////////////
//采样数据(就是接收端判断电平), 输出数据(发送端改变电平)
总结:
SPI它是在SPICLK边沿时(上升沿/下降沿)进行采样数据或者输出数据的.
CPOL是表示空闲时SPICLK电平, 0表示空闲时低电平, 1表示空闲时高电平.
CPHA是表示在SPICLK的第几个边沿进行采样数据的, 0表示第0个边沿时进行采样数据, 1表示在第1个边沿时进行采样数据.
////////////////////////////////////////////////////////////////
SPI设备没有设备地址, 多个设备连接时同一个控制器时,需要用不同的片选线(也就是不同的IO口)来区别要访问的设备。如下图:
/////////////////////////////////////
参考一个spi接口的lcd屏51代码了解spi时序
这个屏只能接收主机发过来的命令和数据, 所以用不上MISO.
sbit cs =P0^0;
sbit reset =P0^1;
sbit rs =P0^2;
sbit sda =P1^5;//MOSI
sbit scl =P1^7;//CLK
void write_command(uchar c) //告诉屏要配置的寄存器地址
{
cs=0;
rs=0;
bitdata=c;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}
void write_data(uchar d) //告诉屏要设置的值
{
cs=0;
rs=1;
bitdata=d;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}