主题中讨论的其他器件: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);
中断;
默认值:
中断;
}
}