查看: 2463|回复: 0

[技术交流] SPI工作原理简介(SX127X底层驱动SPI读写buffer操作)

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2019-7-31 20:29:07 | 显示全部楼层 |阅读模式
从图中可以看出, 主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
通过上面的SPI传输介绍,我们就很清楚了SPI的一个通信过程,下面我们通过MSP430的一个读、写操作来详细说明,如下两段代码是取自SX127X底层驱动MSP430F4152的写buffer和读buffer。

一、SPI写buffer操作代码
  1. void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
  2. {
  3.     uint8_t i;  
  4.     //NSS = 0;
  5.     SPI_NSS_OUT = 0;
  6.     IFG2 &= ~UCB0RXIFG;                     // Clear flag(
  7.     UCB0TXBUF = (addr | 0x80);              // Send address  
  8.     while (!(IFG2&UCB0RXIFG));              // Wait for TX to finish
  9.     for( i = 0; i < size; i++ )
  10.     {
  11.         IFG2 &= ~UCB0RXIFG;
  12.         UCB0TXBUF = buffer[i];                // Send data
  13.         while (!(IFG2&UCB0RXIFG));            // Wait for TX to finish
  14.     }
  15.     //NSS = 1;
  16.     SPI_NSS_OUT = 1;
  17. }
复制代码
  • 当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操作代码
  1. void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
  2. {
  3.     uint8_t i;
  4.    
  5.     //NSS = 0;
  6.     SPI_NSS_OUT = 0;
  7.     IFG2 &= ~UCB0RXIFG;                       // Clear flag
  8.     UCB0TXBUF = (addr & 0x7F);                // Send address
  9.     while (!(IFG2&UCB0RXIFG));                // Wait for end of addr byte TX
  10.     IFG2 &= ~UCB0RXIFG;                       // Clear flag
  11.     for( i = 0; i < size; i++ )
  12.     {   
  13.         UCB0TXBUF = 0;                          //Initiate next data RX
  14.         while (!(IFG2&UCB0RXIFG));              // Wait for RX to finish
  15.         buffer[i] = UCB0RXBUF;                  // Store data from last data RX
  16.         //读取UCB0RXBUF后,IFG自动Reset
  17.     }  
  18.     //NSS = 1;
  19.     SPI_NSS_OUT = 1;
  20. }
复制代码

  • 当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;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表