主题中讨论的其他器件:MSP430FR5989、 MSP430FR5969
工具/软件:Code Composer Studio
我的电路采用 MSP430FR5989、需要激活3个 SPI 模块 UCBA1、UCB0、UCB1。 开始使用以下引脚测试 UCB0和 UCB1:UCB0:P1.4、P1.6、P1.7和 UCB1:P3.0、P3.1、P3.2
我测试过的代码如下所示。 当我运行代码时、我检查示波器上的引脚、CLK 引脚上没有 CLK 信号、SIMO 引脚上没有数据(我也检查了其他引脚)
我在 TI 开发板上使用 MCU MSP430FR5969测试了相同的代码。 我只针对相应的引脚(P2.2、P1.6、P1.7)更改此行。 它在开发板上工作正常。 有一次我忘记将 P2.2作为时钟进行更改、但使用 launchpad 上的 MOSI 引脚时仍然工作正常。
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN4 + GPIO_PIN6 + GPIO_PIN7、
GPIO_secondary 模块功能
);
我已经检查了 CCS 调试器上的 UCBA1和 CS (时钟系统)寄存器、这两个 MCU 的寄存器是相同的。 我看不到寄存器有什么区别
我已经在引脚 P1.6和 P1.7上将 UCB0测试为 I2C、并且在引脚上没有任何活动的情况下具有相同的结果。
我还测试了 P1.4、P1.6和 P1.7引脚作为 GPIO 输出、并使用一定的延迟对其进行齿形处理。 我可以清楚地看到示波器上的活动。 我确信芯片焊接良好、测量点连接到芯片。
当我将引脚设置为 GPIO 时、它们是可以的、但我无法将它们设置为 SPI 或 I2C。 请帮助解决该问题。
#include #include //#include "I2CMaster.h" uint8_t TXData; uint8_t RXData; void delayms (int ms){ int i; while (ms--){ I = 1000; while (i--); } } int main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 //将 DCO 频率设置为最大 DCO 设置 CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_6);// DCO @8MHz // CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3); //选择 DCO 作为没有分频器的 SMCLK 的时钟源 CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_Clock_divider); CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_Clock_divider); GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); //GPIO 测试初始 化// GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN4|GPIO_PIN6| GPIO_PIN7); GPIO_setPeripheralModuleFunctionInputPin ( GPIO_PORT_P1、 GPIO_PIN4 + GPIO_PIN6 + GPIO_PIN7、 GPIO_secondary _module_function ); PMM_unlockLPM5 (); // ///初始化主 控 EUSCI_B_SPI_initMasterParam param ={0}; param.selectClockSource = EUSCI_B_SPI_CLOCKSOURCE_SMCLK; param.clockSourceFrequency = CS_getSMCLK (); param.desiredSpiClock = EUSCI_B_parm000_parmsb; = EUSCI_parmsbFirst;parms500bst param.clockPhase = eUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next; param.clockPolarity = eUSCI_B_SPI_CLOCKPOLAR_INACT_HIGH; param.spiMode = eUSCI_B_SPI_3Pin; eUSCI_B_SPI_initMaster (USCI_B&bparam_base);param_0 EUSCI_B_SPI_ENABLE (EUSCI_B0_BASE); EUSCI_B_SPI_clearInterrupt (EUSCI_B0_BASE、 EUSCI_B_SPI_Receive_interrupt); //启用 USCI_B0 RX 中断 EUSCI_B_SPI_enableInterrupt (EUSCI_B0_BASE、 EUSCI_B_SPI_Receive_interrupt); __DELAY_CYCLES (200); TXData = 0x55; //保持 TX 数据 while (1){ while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B0_BASE、 EUSCI_B_SPI_Transmit 中断); //向从器件发送数据 EUSCI_B_SPI_transmitData (EUSCI_B0_BASE、TXData); GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0); //GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN4 + GPIO_PIN6 + GPIO_PIN7); delayM(50岁); GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0); //GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN4 + GPIO_PIN6 + GPIO_PIN7); delayMs(50); } 返回0; } __attribute__((中断(USCI_B0_vector)) void USCI_B0_ISR (void) { 开关(__evo_in_range (UCB0IV、USCI_SPI_UCTXIFG)) { USCI_SPI_UCRXIFG 案例: // UCRXIFG //USCI_B0 TX 缓冲器准备好了吗? while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B0_BASE、 EUSCI_B_SPI_Transmit 中断); RXData = EUSCI_B_SPI_receiveData (EUSCI_B0_BASE); //递增数据 // TXData++; //发送下一个值 // EUSCI_B_SPI_transmitData (EUSCI_B0_BASE、 // TXData // ); //从机处理信息的传输之间的延迟 _DELAY_CYCLES (40); 中断; 默认值: 中断; } }