Other Parts Discussed in Thread: LDC1612, TMP102,
我在使用库函数,430作为主机读取LDC1612从机的数据,当函数执行到EUSCI_B_I2C_masterReceiveMultiByteFinish(EUSCI_B2_BASE);时一直处于卡在 while (!(HWREG16(baseAddress + OFS_UCBxIFG) & UCRXIFG)) ;
我使用示波器查看了下,卡在这里时SCL一直处于拉低状态,但是我使用单个字节读取的函数一切是正常的。
以下是我的配置和正在调试的代码片段,其他的内容还包括一个UART和一个外部触发中断。
void IIC_init(void){ EUSCI_B_I2C_initMasterParam iic_param = {0}; iic_param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK; iic_param.i2cClk = CS_getSMCLK(); iic_param.dataRate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS; iic_param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP; iic_param.byteCounterThreshold = 1; EUSCI_B_I2C_initMaster(EUSCI_B2_BASE, & iic_param); //set slave address EUSCI_B_I2C_setSlaveAddress(EUSCI_B2_BASE, LDC_ADDRESS); //使能IIC EUSCI_B_I2C_enable(EUSCI_B2_BASE); //清除IIC中断 EUSCI_B_I2C_clearInterrupt(EUSCI_B2_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0 + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT); // //Enable master interrupt // EUSCI_B_I2C_enableInterrupt(EUSCI_B2_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0); while(EUSCI_B_I2C_isBusBusy(EUSCI_B2_BASE)); printf("I2C in Master mode initial finish!\r\n"); return; }
void IIC_Read_Bytes(uint8_t RegAddr, uint8_t length){ i2c_rx_buf_len = length; uint8_t data1,data2; while(EUSCI_B_I2C_isBusBusy(EUSCI_B2_BASE)); EUSCI_B_I2C_setMode(EUSCI_B2_BASE, EUSCI_B_I2C_TRANSMIT_MODE); EUSCI_B_I2C_masterSendSingleByte(EUSCI_B2_BASE, RegAddr); //receive EUSCI_B_I2C_setMode(EUSCI_B2_BASE, EUSCI_B_I2C_RECEIVE_MODE); //Init iic send data and stati EUSCI_B_I2C_masterReceiveStart(EUSCI_B2_BASE); data1 = EUSCI_B_I2C_masterReceiveMultiByteNext(EUSCI_B2_BASE); data2 = EUSCI_B_I2C_masterReceiveMultiByteFinish(EUSCI_B2_BASE); }