MSP430 SPI驱动 代码设计流程

MSP430 SPI驱动 代码设计流程

平常工作中,如果使用MSP430作为主控芯片,经常会遇到需要编写SPI 或 I2C 驱动,来读取和控制外设(比如LCD屏幕,一些传感器)的情况。为了减少重复性工作,本文以具体实例来总结SPI驱动编写的详细步骤(用MSP430FR6989来驱动集成模拟前端AFE4400):

  • 单片机SPI引脚设置
  • SPI读写时序设置
  • 寄存器写入
  • 写在最后

单片机SPI引脚设置

一般SPI有3线和4线之分,区别在于是否带片选端——STE引脚,4个引脚功能说明:
UCxS0MI:主模式数据输入,从模式下数据输出;
UCxSIMO:主模式数据输出,从模式下数据输入;
UCxCLK:USCI SPI的时钟;
UCxSTE:USCI SPI的使能端;

引脚设置代码:

void Set_UCB0_SPI(void)
{
  P1SEL0 |= BIT4 | BIT6 | BIT7;   // 激活相应引脚为SPI功能,这里使用USCI_B0 (SPI P1.4 UCB0CLK P1.7 UCB0SOMI )                  
  P1DIR &= ~BIT6;                 // P1.6 UCB0SOMI 这里的单片机是主机,设置为输入方向
  P1DIR |=  BIT5 | BIT4 | BIT7;   //  P1.5(SPI STE)P1.4(UCB0CLK)P1.7(UCB0SOMI)都是输出引脚
  P1OUT |= BIT5;                  // 使能端置高,此时不进行SPI通信
  PM5CTL0 &= ~LOCKLPM5;      // 激活单片机以上引脚的设置,注意!!!MSP430FR系列单片机特殊命令,之前没有发现这一
                             //条命令,所有的引脚配置均不工作,我被00坑了半天!!!
  UCB0CTLW0 |= UCSWRST;                     // Enable SW reset
  UCB0CTLW0 |= UCMSB+UCCKPH+UCMST+UCSYNC;   
    //  1 -  Synchronous mode 
    // [b2-1] 00-  3-pin SPI
    // [b3]   1 -  Master mode
    // [b4]   0 - 8-bit data
    // [b5]   1 - MSB first
    // [b6]   0 - Clock polarity high.
    //[b7] 1 - Clock phase - Data is captured on the first UCLK edge and changed on the following edge.
    //以上设置参考需要驱动的模块的手册,注意[b3] [b4]位!
  UCB0CTLW0 |= UCSSEL_2;          // SMCLK
  UCB0BR0 = 0x01;                 // 16 MHz
  UCB0BR1 = 0;                    //
  UCB0CTLW0 &= ~UCSWRST;          // Clear SW reset, resume operation
  //UCB0IE = 0x00;
}

SPI读写时序设置

根据的数据手册,读懂模块的SPI读写时序是编写成功的关键步骤!!!
以下是AFE4400的SPI读写时序图:

MSP430 SPI驱动 代码设计流程_第1张图片
MSP430 SPI驱动 代码设计流程_第2张图片

读数据时:拉低STE,先发送一个字节的寄存器地址给AFE4400,等待一会后,AFE4400会返回该地址的数据到单片机,一个字节一个字节地发送,共3个字节24位数据。(单片机需要一次发送 三次接收)
写数据时:拉低STE,先发送想要写入的寄存器地址,然后依次发送3个字节24位的数据,就可以改变AFE4400中相应寄存器的数据。(单片机需要一次发送 三次接收)

SPI读取AFE4400寄存器值的代码:

unsigned long AFE4400_Reg_Read(unsigned char Reg_address)
{
  unsigned char SPI_Rx_buf[4]; //存放读取到的寄存器值
  unsigned long retVal;
  retVal = 0;
  P1OUT&= ~BIT5;   //  拉低STE

  UCB0TXBUF = Reg_address;          // 发送需要读取的寄存器地址
  while ( (UCB0STAT & UCBUSY) );    // USCI_B0 TX buffer ready?
  SPI_Rx_buf[0] = UCB0RXBUF;        // 读取接收到的数据,此时为空数据
  UCB0TXBUF = 0;                    // 空指令,等待延时作用
  while ( (UCB0STAT & UCBUSY) );    // USCI_B0 TX buffer ready?
  SPI_Rx_buf[1] = UCB0RXBUF;        // 读取接收到的数据: Data[23:16]
  UCB0TXBUF = 0;                   // 空指令,等待延时作用
  while ( (UCB0STAT & UCBUSY) );    // USCI_B0 TX buffer ready?
  SPI_Rx_buf[2] = UCB0RXBUF;        // 读取接收到的数据: Data[15:8]
  UCB0TXBUF = 0;                   // 空指令,等待延时作用
  while ( (UCB0STAT & UCBUSY) );        // USCI_B0 TX buffer ready?
  SPI_Rx_buf[3] = UCB0RXBUF;            // 读取接收到的数据: Data[7:0]

  P1OUT|=BIT5;  // 读取完成,拉高STE
  retVal = SPI_Rx_buf[1];  //数据整合成24位数据
  retVal = (retVal << 8) | SPI_Rx_buf[2];
  retVal = (retVal << 8) | SPI_Rx_buf[3]; 

  return    retVal;
}

SPI把数据写入AFE4400寄存器中的代码:

void AFE4400_Reg_Write (unsigned char reg_address, unsigned long data)
{
  unsigned char dummy_rx;

  P1OUT&= ~BIT5;   //  拉低STE

  UCB0TXBUF = reg_address;        // 发送需要写入的寄存器地址
  while ( (UCB0STAT & UCBUSY) );  // USCI_B0 TX buffer ready?
  dummy_rx = UCB0RXBUF;         // 空指令,等待延时作用
  UCB0TXBUF = (unsigned char)(data >>16);  // 把需要写入的数据: Data[23:16]传给发送缓存器
  while ( (UCB0STAT & UCBUSY) );        // USCI_B0 TX buffer ready?
  dummy_rx = UCB0RXBUF;         // 空指令,等待延时作用
  UCB0TXBUF = (unsigned char)(((data & 0x00FFFF) >>8));   // 把需要写入的数据: Data[15:8]传给发送缓存器 
  while ( (UCB0STAT & UCBUSY) );              // USCI_B0 TX buffer ready?
  dummy_rx = UCB0RXBUF;                       // 空指令,等待延时作用
  UCB0TXBUF = (unsigned char)(((data & 0x0000FF)));     // 把需要写入的数据: Data[7:0]传给发送缓存器
  while ( (UCB0STAT & UCBUSY) );                        // USCI_B1 TX buffer ready?
  dummy_rx = UCB0RXBUF;                         // 空指令,等待延时作用

  P1OUT|=BIT5;  // 写入完成,拉高STE
}

寄存器写入

完成以上两步我们后,AFE4400就可以乖乖地为我们所用,非常听我们的话!通过查看寄存器功能手册,写入相应的值对AFE4400的功能进行配置,可以实现我们想要的功能。
AFE4400的一些寄存器:

MSP430 SPI驱动 代码设计流程_第3张图片


最后

以上程序参考来自TI公司的AFE4400评估板的源程序,由衷感谢!!!
详见 http://www.ti.com.cn/tool/cn/afe4400spo2evm

  • MSP430 SPI驱动 代码设计流程
    • 单片机SPI引脚设置
    • SPI读写时序设置
    • 寄存器写入
    • 最后

你可能感兴趣的:(MSP430,AFE4400)