master给slave读写数据的过程是这样的:写:master对DR写数据,产生clock,同时数据从MOSI管脚移位发送到slave的MOSI管脚; 读:master对DR写DUMMy,产生clock,同时DUMMy由MOSI发给slave(这个数据没有意义),同时读取的数据从slave的MISO管脚移位发送到master的MISO管脚
{
SPIF = 0;
SPI0DAT = ch;
while (SPIF == 0); // wait for data transfer to be completed
}
unsigned char GetSPIByte(void)
{
SPIF = 0;
SPI0DAT = 0; //dummy 哑字节
while (SPIF == 0);
return SPI0DAT; // read data from SPI
}
示波器(带SPI)查看SPI波形,要把NSS片选信号接入,才能看到SPI数据显示
SPI 的时钟信号要配置成推挽方式而不是漏极开路方式,因为漏极开路会导致上升时间过长,当SPI速率较高时,会有问题
一般的SPI CS可以接地,但有些芯片要求CS,取决于芯片内部接口逻辑。例如芯片手册有如下描述:Before the controller starts the data transfer, the software has to generate a falling edge on the pin connected to CS,这样就不能直接CS接地
同步外设接口(SPI)是由摩托罗拉公司开发的全双工同步串行总线,该总线大量用在与EEPROM、ADC、FRAM和显示驱动器之类的慢速外设器件通信。 SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI 接口由SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(从使能信号)四种信号构成,CS 决定了唯一的与主设备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟来发起通讯。通讯时,数据由SDO 输出,SDI 输入,数据在时钟的上升或下降沿由SDO 输出,在紧接着的下降或上升沿由SDI 读入,这样经过8/16 次时钟的改变,完成8/16 位数据的传输。 SPI通信 Clock Polar 时钟极性 ---CPOL
Clock Phase 时钟相位 ---CPHA
数据方向和通信速度
SPI传输串行数据时首先传输最高位。波特率可以高达5Mbps,具体速度大小取决于SPI硬件。例如,Xicor公司的SPI串行器件传输速度能达到5MHz。
SPI总线接口及时序
|