在MSP430FR2433平台调试I2C接口时发现通讯异常,表现为进行发送并转换为接收,在接收完预期字节数后,别外产生了多个时钟信号,并且调试程序时发现其死在如下代码(库函数):
多余的时钟(如红框所示):
在库函数基础上编写的I2C读写代码,未使用中断
void I2C_init(void)
{
EUSCI_B_I2C_initMasterParam param = {0};
// Configure Pins for I2C
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_UCB0SCL,GPIO_PIN_UCB0SCL,GPIO_FUNCTION_UCB0SCL);
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_UCB0SDA,GPIO_PIN_UCB0SDA,GPIO_FUNCTION_UCB0SDA);
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = CS_getSMCLK();
param.dataRate = EUSCI_B_I2C_SET_DATA_RATE_100KBPS;
param.byteCounterThreshold = 0;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
EUSCI_B_I2C_initMaster(EUSCI_B0_BASE, ¶m);
}
void I2C_send_to_receive(uint8_t id, uint8_t *sbuf, uint8_t slen, uint8_t *rbuf, uint8_t rlen)
{
uint16_t i;
while(EUSCI_B_I2C_SENDING_STOP == EUSCI_B_I2C_masterIsStopSent(EUSCI_B0_BASE));
EUSCI_B_I2C_disable(EUSCI_B0_BASE);
EUSCI_B_I2C_setSlaveAddress(EUSCI_B0_BASE, id);
EUSCI_B_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_TRANSMIT_MODE);
EUSCI_B_I2C_enable(EUSCI_B0_BASE);
//EUSCI_B_I2C_disableInterrupt(EUSCI_B0_BASE, 0xff);
EUSCI_B_I2C_masterSendMultiByteStart(EUSCI_B0_BASE, sbuf[0]);
for(i = 1; i < slen; i++)
{
EUSCI_B_I2C_masterSendMultiByteNext(EUSCI_B0_BASE, sbuf[i]);
}
if(rlen)
{
EUSCI_B_I2C_masterReceiveStart(EUSCI_B0_BASE);
for(i = 0; i < rlen - 1; i++)
{
rbuf[i] = EUSCI_B_I2C_masterReceiveSingle(EUSCI_B0_BASE);
}
rbuf[i] = EUSCI_B_I2C_masterReceiveMultiByteFinish(EUSCI_B0_BASE);
}
else
{
EUSCI_B_I2C_masterSendMultiByteStop(EUSCI_B0_BASE);
}
}
不知程序是否有误?
环境:
MCU:msp430fr2433
供电:3.3VDC
I2C连接器件:HT16L23