MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用

一、 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引脚使用。

// 使用eUSCI_B1外设模块
P5.0 --------SPI.MOSI
P5.1 --------SPI.MISO
P5.2 --------SPI.SCLK
P8.3 --------SPI.CS(gpio模拟)

MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第1张图片
MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第2张图片
MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第3张图片
红色区域为launchpad板载5994芯片的引脚(板载LQFP80封装,代号PN80)
MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第4张图片

三、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参数设置(初始化)
MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第5张图片

  • 1) 置位UCSWRST;
  • 2)初始化SPI相关寄存器;
  • 3)相关端口初始化;
  • 4)为了避免不可预知的操作,确保SCLK、MISO、MOSI各端口都在“最终”电平;
  • 5)复位UCSWRST(使能SPI);
  • 6)使能相关中断(如果必要的话)。
    UCSWRST位
    UCSWRST

四、测试

4.1 SPI初始化

void spi_init()
{
    /*
     * Select Port 8
     * Set Pin 3 as output
     * SPI_CS
     */
    GPIO_setAsOutputPin(
        GPIO_PORT_P8,
        GPIO_PIN3
    );
    /*
    * Select Port 8
    * Set Pin 3 to output Low.
    * SPI_CS
    */
    GPIO_setOutputHighOnPin(
        GPIO_PORT_P8,
        GPIO_PIN3
    );
   
    /*
    * Select Port 5
    * Set Pin 0, 1, 2 to input Secondary Module Function, (UCB0TXD/UCB0SIMO, UCB0RXD/UCB0SOMI).
    */
    GPIO_setAsPeripheralModuleFunctionInputPin(
        GPIO_PORT_P5,
        GPIO_PIN0 + GPIO_PIN1 + GPIO_PIN2,
        GPIO_PRIMARY_MODULE_FUNCTION
    );

    //Initialize Master
    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, &param);

    //Enable SPI module
    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 结果

单字节波形图
MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第6张图片
解析结果
MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第7张图片
多字节发送波形图
MSP430FR5994LannchPad开发笔记之四:eUSCI之硬件SPI使用_第8张图片
–(END)–

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