【七】Serial communications with SPI
1. mbed SPI master library functions(SPI主机库函数)
//建立SPI master连接到SPI通信引脚,如果不手动设置格式和频率的话,默认是8bits, mode=0, 频率1MHz
SPI(PinName mosi, PinName miso, PinName sclk, PinName _unused=NC);
//设置SPI工作的传输模式和传输一帧的比特数,mode取值为0-3,bits取值为4-16
void format(int bits, int mode = 0);
//设置SPI bus clock frequency
void frequency(int hz = 1000000);
//SPI master向Slave发送数据,返回Slave的返回值
virtual int write(int value);
2. SPI master应用过程:
1. SPI初始化,包括工作模式format,工作频率frequency;
频率要根据从机设备slave device (最高70 MHz)
2. SPI主机的收发
1)主机将从机片选信号(CS) 拉底至0 V
2)接着,主机通过SCLK,传输时钟脉冲,表明数据将要被传输
3)同时,主机通过MOSI发送数据,同时从机通过MISO返回数据
3. SPI Master读写操作:
之前提到,如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节(Dummy Byte)来引发从机的传输。当主机发送一个连续的数据流时,有些外设能够进行多字节传输。多数具有SPI接口的存储芯片就以这种方式工作。在这种传输方式下,从机的片选端必须在整个传输过程中保持低电平。
下面以Bosch BMP280传感器为例:
根据Datasheet所述:
(1) SPI 模式:
BMP280的SPI支持两种传输模式:模式0和模式3。
寄存器地址的最高位MSB指示SPI读写操作,其中,0表示写寄存器,1表示读寄存器。7位的寄存器地址与最高位的读写控制bit组成了控制字Control Byte. (The control byte consists of the SPI register address (= full register address without bit 7) and the write/read command.)
SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK);
DigitalOut CS(SPI_CS);
(2)SPI写操作流程:
拉低片选,Set CS low: CS=0;
发送写控制字,Send Write_Control byte: spi.write(regAddr & ~0x80);
发送要写的数据,Send Data byte: spi.write(data);
拉高片选,Set CS high: CS=1。
其中,片选有效后,发送一个Control byte, 写一个Data byte,然后发送地址增加1后的下一个Control byte, 写Data byte。可以一直写,直到结束然后将CS拉高。
(3)SPI读操作(4线SPI为例):
Set CS low: CS=0;
Send Read_Control byte: spi.write(regAddr | 0x80);
发送空字节,引发传感器传输,读取返回值:Send Dommy byte:
data=spi.write(0x00);
Set CS high: CS=1。
其中,片选有效后,先发送一个Control byte,而后每发送一个空字节,寄存器地址会自动增加1,读取返回值。直到结束将CS拉高
作者微信