一、 MSP430FR5994 eUSCI概述
eUSCI 模块用于串行数据通信。 eUSCI 模块支持同步SPI(3 pin或4 pin)和I2C等通信协议,以及异步通信协议,如UART、具有自动波特率检测功能的增强型 UART 和 IrDA。 eUSCI_An 模块提供对 SPI(3 针或 4 针)、UART、增强型 UART 和 IrDA 的支持。 eUSCI_Bn 模块提供对 SPI(3 针或 4 针)和 I2C 的支持。 根据封装的不同,MSP430FR5994最多可实现四个 eUSCI_A 模块和最多四个 eUSCI_B 模块。
二、 MSP430FR5994的硬件SPI
2.1 特性
- 7 位或 8 位数据长度
- LSB-first 或 MSB-first 数据发送和接收
- 3 线和 4 线 SPI 操作
- 主模式或从模式
- 独立的发送和接收移位寄存器
- 单独的发送和接收缓冲寄存器
- 连续发送和接收操作
- 可选择的时钟极性和相位控制
- 主模式下的可编程时钟频率
- 接收和发送的独立中断能力
- LPM4 下的从(slave)模式操作
2.2 MSP430FR5994 launchpad SPI使用
根据(一)中所示,MSP430FR5994硬件SPI可以由eUSCI_An模块或eUSCI_Bn来实现,最多可实现8路SPI。 这里根据launchpad引脚分布,选择下图中标注“SPI”部分引脚作为硬件SPI引脚使用。
P5.0 --------SPI.MOSI
P5.1 --------SPI.MISO
P5.2 --------SPI.SCLK
P8.3 --------SPI.CS(gpio模拟)
红色区域为launchpad板载5994芯片的引脚(板载LQFP80封装,代号PN80)
三、driverLib SPI API说明及初始化
3.1 函数集
- EUSCI_B_SPI_changeClockPhasePolarity 时钟相位和极性设置
- EUSCI_B_SPI_changeMasterClock 设置时钟及频率
- EUSCI_B_SPI_clearInterrupt 清中断标志
- EUSCI_B_SPI_disable 失能SPI外设
- EUSCI_B_SPI_disableInterrupt 失能中断
- EUSCI_B_SPI_enable 使能SPI
- EUSCI_B_SPI_enableInterrupt 使能中断
- EUSCI_B_SPI_getInterruptStatus 获取中断标志
- EUSCI_B_SPI_getReceiveBufferAddress 获取接收缓存地址
- EUSCI_B_SPI_getTransmitBufferAddress 获取发送缓存地址
- EUSCI_B_SPI_initMaster 初始化SPI模块,该SPI作为master
- EUSCI_B_SPI_initSlave 初始化SPI模块,该SPI作为slave
- EUSCI_B_SPI_isBusy 判断是否busy
- EUSCI_B_SPI_receiveData 接收一个字节数据
- EUSCI_B_SPI_select4PinFunctionality 设置为4线SPI模式
- EUSCI_B_SPI_transmitData 发送一个字节数据
3.2 SPI初始化步骤
eUSCI 由 PUC 或 UCSWRST 位复位。 在 PUC 之后,UCSWRST 位自动置位,使 eUSCI 保持在复位状态。 置位时,UCSWRST 位复位 UCRXIE、UCTXIE、UCRXIFG、UCOE 和 UCFE 位,并设置 UCTXIFG 标志。 清除 UCSWRST 会释放 eUSCI 进行操作。 配置和重新配置 eUSCI 模块时应在 UCSWRST 置位时,以避免不可预知的行为。 复位UCSWRST位,使能SPI模块;置位UCSWRST位,SPI不工作;UCSWRST置位时,进行SPI参数设置(初始化)
- 1) 置位UCSWRST;
- 2)初始化SPI相关寄存器;
- 3)相关端口初始化;
- 4)为了避免不可预知的操作,确保SCLK、MISO、MOSI各端口都在“最终”电平;
- 5)复位UCSWRST(使能SPI);
- 6)使能相关中断(如果必要的话)。
UCSWRST位:
四、测试
4.1 SPI初始化
void spi_init()
{
GPIO_setAsOutputPin(
GPIO_PORT_P8,
GPIO_PIN3
);
GPIO_setOutputHighOnPin(
GPIO_PORT_P8,
GPIO_PIN3
);
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_P5,
GPIO_PIN0 + GPIO_PIN1 + GPIO_PIN2,
GPIO_PRIMARY_MODULE_FUNCTION
);
EUSCI_B_SPI_initMasterParam param = {0};
param.selectClockSource = EUSCI_B_SPI_CLOCKSOURCE_SMCLK;
param.clockSourceFrequency = CS_getSMCLK();
param.desiredSpiClock = 500000;
param.msbFirst = EUSCI_B_SPI_MSB_FIRST;
param.clockPhase = EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT;
param.clockPolarity = EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH;
param.spiMode = EUSCI_B_SPI_3PIN;
EUSCI_B_SPI_initMaster(EUSCI_B1_BASE, ¶m);
EUSCI_B_SPI_enable(EUSCI_B1_BASE);
}
4.2 SPI单字节发送
void spi_put(uint8_t byte)
{
GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN3);
EUSCI_B_SPI_transmitData(EUSCI_B1_BASE,byte);
while(EUSCI_B_SPI_isBusy(EUSCI_B1_BASE));
GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN3);
}
4.3 结果
单字节波形图 解析结果 多字节发送波形图 –(END)–
|