工具/软件:Code Composer Studio
大家好、
MSP430FR5739通过 SPI 与其他模块(在这里我称之为模块)连接。 A-Module 是主模块、它支持 SPI 时钟并控制 CS 引脚、MSP430FR5739是 slaver.最近我遇到了一个奇怪的问题.
A 模块与 MSP430FR5739进行通信正常、但当 MSP430FR5739保持当前的上电状态(不关闭电源、然后再次打开电源)、然后 A 模块重新启动(关闭电源、然后再次打开电源)时、SPI 通信将失败。 失败表示未捕获中断。 MSP430FR5739重新启动将再次正常、但如果保持 MSP430FR5739上电状态并仅启动 A 模块、则 SPI 通信将失败。
下面是我的 A 模块 SPI 初始化和 MSP430FR5739 SPI 初始化。 plz 帮助我。
A 调制:
VL_ssidevcfg.clkFreq = SSI_SYSTEM_DIV_256;//101562HZ
VL_ssidevcfg.gpioNumber = CUST_GPIO_SSI_SEL0;
VL_ssidevcfg.lag = SSI_LAG_1;
VL_ssidevcfg.lead = SSI_LEAD_1;
VL_ssidevcfg.clkOn = SSI_SSIMCLK_ON;
VL_ssidevcfg.mode = SSI_BYTETRANSFER;
vL_ssidevcfg.rxWidth = 8;
VL_ssidevcfg.txWidth = 8;
VL_ssidevcfg.format = SSI_MSBFIRST;
VL_ssidevcfg.cycleDelay = SSI_ONECYCLE;
vL_ssidevcfg.clkPolarity = SSI_IDLE_LOW;//----- SPI_CLOCKPOLARITY_INACTION_LOW
VL_ssidevcfg.wrPolarity = SSI_RISE_EDGE;//--- SPI_PHASE_DATA_Captured_ONFIRST_Changed_ON_NEXT
VL_ssidevcfg.rdPolarity = SSI_FALLING_EDGE;//--- SPI_PHASE_DATA_Captured_ONFIRST_Changed_ON_NEXT
VL_ssidevcfg.enPolarity = SSI_ACTIVE_LOW;//--- CS
VL_ssidevcfg.wireTM 模式= SSI_4WIRE; //--- 4线
VL_ssidevcfg.pIsrCallbackFct =空;
cust2_0spiinit (&vl_ssidevcfg);
MSP430FR5739:
/*------ 时钟--- *
//将 DCO 频率设置为8MHz
CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3);
//将 MCLK、SMCLK 和 ACLK 配置为 DCOCLK 的源
CS_initClockSignal (CS_ACLK、CS_DCOCLK_select、CS_Clock_divider _32);
/*------ SPI 初始化--- *
空 EUSCI_B0_GraceInit (空)
{
EUSCI_B_SPI_initSlaveParam param ={0};
param.msbFirst = EUSCI_B_SPI_MSB_FIRST;
param.clockPhase = EUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_capted_on_next;
param.clockPolarity = EUSCI_B_SPI_CLOCKPOLARITY_INACT_LOW;
param.spiMode = EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW;
EUSCI_B_SPI_initSlave (EUSCI_B0_BASE、param);
/*启用 eUSCI SPI */
EUSCI_B_SPI_ENABLE (EUSCI_B0_BASE);
EUSCI_B_SPI_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);
/*启用 eUSCI SPI 接收中断*/
EUSCI_B_SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);
}
/*
* ==== eUSCI_B0中断服务例程====
*
#pragma vector=USCI_B0_vector
_interrupt void USCI_B0_ISR_Hook (void)
{
/*用户代码开始(部分:USCI_B0_ISR_Hook)*/
switch (__evo_in_range (UCB0IV、4))
{
//Vector 2 - RXIFG
案例2:
//USCI_A0 TX 缓冲器准备好了吗?
G_ReceiveData = EUSCI_B_SPI_receiveData (EUSCI_B0_BASE);
Ring_buffer_queue (&g_RingBuffer、g_ReceiveData);
if (g_ReceiveData = type_SYNC_END)
{
Ring_buffer_size_t length = ring_buffer_num_items (&g_RingBuffer);
Timer_B_STOP (timer_B0_BASE);
Ring_buffer_dequeue_arr (&g_RingBuffer、(char *) g_SPI_RxBuffer、长度);
U8 CRC = g_SPI_RxBuffer[length - 2];
while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断));
{
//将 CRC 数据发送到 SIMCOM
EUSCI_B_SPI_transmitData (EUSCI_B0_BASE、CRC);
}
messageParser (g_SPI_RxBuffer、长度);
}
//printf ("recv %c"、g_ReceiveData);
中断;
默认值:break;
}
/*用户代码结束(部分:USCI_B0_ISR_Hook)*/
}