从图中可以看出, 主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。 通过上面的SPI传输介绍,我们就很清楚了SPI的一个通信过程,下面我们通过MSP430的一个读、写操作来详细说明,如下两段代码是取自SX127X底层驱动MSP430F4152的写buffer和读buffer。
一、SPI写buffer操作代码 - void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
- {
- uint8_t i;
- //NSS = 0;
- SPI_NSS_OUT = 0;
- IFG2 &= ~UCB0RXIFG; // Clear flag(
- UCB0TXBUF = (addr | 0x80); // Send address
- while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
- for( i = 0; i < size; i++ )
- {
- IFG2 &= ~UCB0RXIFG;
- UCB0TXBUF = buffer[i]; // Send data
- while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
- }
- //NSS = 1;
- SPI_NSS_OUT = 1;
- }
复制代码- 当SX127X 的NSS拉低时才能开始传输:SPI_NSS_OUT = 0;
- 当地址最高位(第7位)为“1”时,用于写访问:UCB0TXBUF = (addr | 0x80);
- 主机发射,直接往TXBUF寄存器中写入一个字节即可开始传输。当数据已经由UCxTXBUF移位到TX移位寄存器发送中断标志位UCTXIFG置位,所以去判断UCTXIFG是否置位,即可判断UCxTXBUF是否已经准备好接收新的数据。但是它不表示RX、TX操作已经完成。主机准备好接收新数据后,从机将自己移位寄存器中的内容返回给主机,当主机接收到字符后,接收数据从接收移位寄存器移入接收缓冲器UCxRXBUF,同时接收中断标志位UCRXIFG被置位,这标志着RX和TX操作已经完成。所以这里使用while (!(IFG2&UCB0TXIFG)),也是可行的;如果使用while (!(IFG2&UCB0RXIFG)),能更充分说明TX操作完成,由于这里是写操作,所以我们忽略接收到的字节即可。
- 当SX127X 传输完成后,NSS拉高:SPI_NSS_OUT = 1;
二、SPI写buffer操作代码 - void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
- {
- uint8_t i;
-
- //NSS = 0;
- SPI_NSS_OUT = 0;
- IFG2 &= ~UCB0RXIFG; // Clear flag
- UCB0TXBUF = (addr & 0x7F); // Send address
- while (!(IFG2&UCB0RXIFG)); // Wait for end of addr byte TX
- IFG2 &= ~UCB0RXIFG; // Clear flag
- for( i = 0; i < size; i++ )
- {
- UCB0TXBUF = 0; //Initiate next data RX
- while (!(IFG2&UCB0RXIFG)); // Wait for RX to finish
- buffer[i] = UCB0RXBUF; // Store data from last data RX
- //读取UCB0RXBUF后,IFG自动Reset
- }
- //NSS = 1;
- SPI_NSS_OUT = 1;
- }
复制代码
当SX127X 的NSS拉低时才能开始传输:SPI_NSS_OUT = 0; 当地址最高位(第7位)为“0”时,用于写访问:UCB0TXBUF = (addr | 0x7F); - 由于这里我们是需要读取一个数据,所以通过发送一个空字节来引发从机传输:UCB0TXBUF = 0;
- 通过while (!(IFG2&UCB0RXIFG)),判断RX完成后,将UCB0RXBUF内容保存即可:buffer = UCB0RXBUF;
当SX127X 传输完成后,NSS拉高:SPI_NSS_OUT = 1;
|