历史上的今天
今天是:2025年02月26日(星期三)
2020年02月26日 | MSP430 SPI驱动 代码设计流程
2020-02-26 来源:eefocus
平常工作中,如果使用MSP430作为主控芯片,经常会遇到需要编写SPI 或 I2C 驱动,来读取和控制外设(比如LCD屏幕,一些传感器)的情况。为了减少重复性工作,本文以具体实例来总结SPI驱动编写的详细步骤(用MSP430FR6989来驱动集成模拟前端AFE4400):
单片机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读写时序图:


读数据时:拉低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的一些寄存器:
史海拾趣
|
AGPS就是移动通讯系统的定位功能,该功能首先在CDMA系统中实现。因CDMA系统需要严格的同步时钟, 该时钟源来自GPS,加上基站的位置可知,于是高精度的定位就可以实现了,不过此技术无法实现大范围机动高精度定位,只 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:03 编辑 CS1610EP静态VFD显示驱动电路很详细的提供了驱动电路,给大家一个很详细的电路 … 查看全部问答> |
|
我用的LPC2378,使用H-JTAG几乎都可以查询到芯片,再用H-FLASHER时大多数只能查到\"Target:ARM7TDMI-S Little-Endian\",而在\"Flash:ERROR\"。在H-FLASHER里选芯片选过LPC 2378和LPC2378_A都不好用。我的并口设置的是SPP模式。… 查看全部问答> |
|
◆ 全面替代S3C2440,且性价比更优 ◆ 模块背面无任何器件,方便直接贴焊或通过插针与底板相连 ◆ 商业级(0°~70°)、工业级(-40°~85°) ◆ 微尺寸(40x40x4mm)、低价格(千片价… 查看全部问答> |
|
vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之 如题:我想在winCE里写一个FTP上传文件的程序,vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之 错误 1 ...… 查看全部问答> |
|
MARVELL PXA310+WM6.0(littleton的BSP)下添加usb mass storage 功能: 以便设备连接到PC上时,能使SD卡像U盘一样在“我的电脑”里呈现出一个盘符, 不通过ActiveSync而是通过usb直接访问。 现在注册表设置好了(99%没错),usbmsfn.dll也已经 ...… 查看全部问答> |




