This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432P401R:I2C接收挂起

Guru**** 2538955 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/575490/msp432p401r-i2c-receive-hang

部件号:MSP432P401R

当我尝试在 driverlib库中执行I2C_masterReceiveSingle函数时,代码挂起于:

同时(!BITBAND_PERI (EUSCI_B_CMSIS (moduleInstance)->IFG,EUSCI_B_IFG_RXIFG0_OFS)); 

注释显示"Polling RXIFG0 if RXIE is not enabled",但我不明白该如何触发此接收中断标志。 我的完整代码如下:

#include "driverlib.h"

#define I2C_PINS GPIO端口P3,GPIO _PIN6 + GPIO _PIN7
#define USI_module EUSCI_B2_BASE
#define slaver_address 0b110万


/* I2C Master配置参数*/
const eUSI_I2C_MasterConfig i2cConfig ={

EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK时钟源
300万, // SMCLK = 3MHz
EUSCI_B_I2C_SET_DATA_RATE_100KBPS, //所需的I2C时钟为100kHz
0, //无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};

int main(void){

WDT_A_HoldTimer();

GPIO_setAsPeripheralModuleFunctionInputPin (I2C_PINS,GPIO主要模块功能);

/*在100kHz的频率下将I2C主设备初始化到SMCLK,没有自动停止*/
I2C_initMaster(USCI_MODULE,&i2cConfig);

/*指定从属地址*/
I2C_setSlaveAddress (USI_MODULE,SLAVE_ADDRESS);

/*将主中继器设置为传输模式*/
I2C_setMode (USI_MODULE,EUSCI_B_I2C_Transmit_MODE);

/*启用I2C模块以启动操作*/
I2C_enableModule (USI_MODULE);

while (I2C_isBusBusy (USI_MODULE)== EUSCI_B_I2C_BUS_BUS_BUSY);

I2C_masterSendSingleByte (USI_MODULE,0x08);

/*将主中继器设置为传输模式*/
I2C_setMode (USI_MODULE,EUSCI_B_I2C_Receive_mode);

/*指定从属地址*/
I2C_setSlaveAddress (USI_MODULE,SLAVE_ADDRESS);

I2C_masterReceiveSingle(USCI_MODULE);
} 

我的示波器显示:从属地址,wr,ack,data,ack, 停止,然后不执行任何操作和调试可确认直到最后一行的所有内容都正确执行,因此我不理解为什么读取操作不发送从属地址。 如有任何帮助或建议,我将不胜感激。

谢谢!

基督教  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I2C_masterReceiveSingle()是将在RX中断处理程序中使用的函数。 要执行完整的事务,您必须使用I2C_masterReceiveSingleByte()

    (您无需再次设置相同的从属地址。)