工具与软件:
您好;
我正在尝试使用 PJ.0/PJ2/PJ3上的 UCA2 SPI 端口。 我无法使它正常工作。
使用相同的代码并将 UCA2的 SPI 映射到 P5.2/P5.1/P5.0、它可以正常工作。
以下是我用于配置 SPI 端口的代码。
这基于我下载的示例项目"eusci_a_spi_ex1_master"。
谢谢!
================
#include "driverlib.h"
uint8_t RXData = 0;
uint8_t TXData = 0;
void main (void)
{
volatile uint16_t i;
//停止看门狗计时器
WDT_A_HOLD (WDT_A_BASE);
/*
*选择端口1
*将引脚0设置为输出
*/
GPIO_setAsOutputPin (
GPIO_PORT_P1、
GPIO_PIN0
);
/*
*选择端口1
*将引脚0设置为输出低电平。
*/
GPIO_setOutputLowOnPin (
GPIO_PORT_P1、
GPIO_PIN0
);
//将 DCO 频率设置为最大 DCO 设置
CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3);
//选择 DCO 作为 SMCLK 的时钟源(无分频器)
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1);
/*
*选择端口 J
*将引脚0设置为输入辅助模块功能(UCA2CLK)。
*/
GPIO_setAsPeripheralModuleFunctionInputPin (
GPIO_PORT_PJ、
GPIO_PIN0、
GPIO_secondary_module_function
);
/*
*选择端口 J
*将引脚2、3设置为输入辅助模块功能(UCA2TXD/UCA2SIMO、UCA2RXD/UCA2SOMI)。
*/
GPIO_setAsPeripheralModuleFunctionInputPin (
GPIO_PORT_PJ、
GPIO_PIN2 + GPIO_PIN3、
GPIO_secondary_module_function
);
/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*/
PMM_UNlockLPM5 ();
//初始化主设备
EUSCI_A_SPI_initMasterParam 参数={0};
param.selectClockSource = EUSCI_A_SPI_CLOCKSOURCE_SMCLK;
param.clockSourceFrequency = CS_getSMCLK ();
param.desiredSpiClock = 500000;
param.msbFirst = EUSCI_A_SPI_MSB_FIRST;
param.clockPhase = EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT;
param.clockPolarity = EUSCI_A_SPI_CLOCKPOLARITY_INACTIVE_HIGH;
param.spiMode = EUSCI_A_SPI_3pin;
EUSCI_A_SPI_initMaster (EUSCI_A2_BASE、¶m);
//启用 SPI 模块
EUSCI_A_SPI_ENABLE (EUSCI_A2_BASE);
EUSCI_A_SPI_clearInterrupt (EUSCI_A2_base、
EUSCI_A_SPI_RECEIVE_INTERRUPT);
//启用 USCI_A2 RX 中断
EUSCI_A_SPI_enableInterrupt (EUSCI_A2_BASE、
EUSCI_A_SPI_RECEIVE_INTERRUPT);
//等待从机初始化
__delay_cycles (100);
TXData = 0x1;//保存 TX 数据
//USCI_A2 TX 缓冲器是否准备就绪?
while (! EUSCI_A_SPI_getInterruptStatus (EUSCI_A2_base、
EUSCI_A_SPI_TRANSMIT_INTERRUPT);
//将数据发送到从机
EUSCI_A_SPI_transmitData (EUSCI_A2_base、TXData);
__bis_SR_register (LPM0_bits + GIE);// CPU 关闭、启用中断
___ no_operation ();//保留在 LPM0中
}
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma VECTOR=USCI_A2_VECTOR
_interrupt
#elif defined (_GNUC__)
_attribute__((interrupt (USCI_A2_VECTOR))
#endif
void USCI_A2_ISR (void)
{
开关(__EVEN_IN_RANGE (UCA2IV、USCI_SPI_UCTXIFG))
{
案例 USCI_SPI_UCRXIFG:// UCRXIFG
//USCI_A2 TX 缓冲器是否准备就绪?
while (! EUSCI_A_SPI_getInterruptStatus (EUSCI_A2_base、
EUSCI_A_SPI_TRANSMIT_INTERRUPT);
RXData = EUSCI_A_SPI_receiveData (EUSCI_A2_BASE);
//递增数据
TXData++;
//发送下一个值
EUSCI_A_SPI_transmitData (EUSCI_A2_BASE、
TXData
);
//从机处理信息的传输之间的延迟
__delay_cycles (40);
休息;
默认值:
休息;
}
}