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.

[参考译文] MSPM0C1104:MSPM0C1104 I2C 不工作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1357269/mspm0c1104-mspm0c1104-i2c-not-working

器件型号:MSPM0C1104

void I2C_READ(){
  /*等待 I2C 进入空闲状态*/
    while (!(
      DL_I2C_getControllerStatus (I2C_INST)和 DL_I2C_CONTROL_STATUS_IDLE)
      ;

    /*增加传输之间的延迟*/
    delay_cycles (1000);

    /*发送读取请求至目标方*/
    DL_I2C_startControllerTransfer (I2C_INST、I2C_TARGET_ADDRESS、
      DL_I2C_CONTROLLER_DIRECTION_RX、I2C_RX_packet_SIZE);

    /*
    *接收来自目标的所有字节。 如果不是所有字节、LED 将保持高电平
    *已收到
    */
    for (uint8_t i = 0;I < I2C_RX_packet_size;I++){
      while (DL_I2C_isControllerRXFIFOEMty (I2C_INST))
        ;
      gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);

    }

void I2C_Write (uint8_t * DataBuffer){
  /*
   *用数据填充 FIFO。 本示例发送的最大值为4个字节、因为
   *不处理 FIFO 已满的情况
   */

   DL_I2C_fillControllerTXFIFO (I2C_INST、&gTxPacket [0]、I2C_TX_packet_size);

   /*等待 I2C 进入空闲状态*/
   while (!(
     DL_I2C_getControllerStatus (I2C_INST)和 DL_I2C_CONTROL_STATUS_IDLE)
     ;

   /*将数据包发送到控制器。
   *此功能将自动发送"开始+停止"。
   */
   DL_I2C_startControllerTransfer (I2C_INST、I2C_TARGET_ADDRESS、
     DL_I2C_CONTROL_DIRECTION_TX、I2C_TX_packet_size);

   /*轮询直到控制器写入所有字节*/
   while (DL_I2C_getControllerStatus (I2C_INST)和
      DL_I2C_CONTROL_STATUS_BUS_BUS)
     ;

   /*存在错误时的陷阱*/
   如果(DL_I2C_getControllerStatus (I2C_INST)和
     DL_I2C_CONTROL_STATUS_ERROR){
     /*如果出现错误,LED 将保持高电平*/
     __BKPT (0);
   }
我将使用以下代码进行 I2C 写入和读取。 写入正在工作、但 I2C 读取不工作。
在.syscfg 控制器模式是启用的、目标模式是禁用的。
您能为我提供成功进行 I2C 读取的解决方案吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TX 封装为3个字节、RX 封装为4个字节。

    TX (I2C 从器件地址、寄存器地址、要写入寄存器的数据)
    Rx 软件包(起始位 I2C 从器件地址 ACK、寄存器地址 ACK、起始位从器件地址 Ack、ReadData ACK 停止位。

    上面是读取数据的帧。

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

    void I2C_READ (uint8_t reg_address){


    /*增加传输之间的延迟*/
    delay_cycles (1000);

    DL_I2C_startControllerTransfer (I2C_INST、I2C_TARGET_ADDRESS、
    DL_I2C_CONTROL_DIRECTION_TX、reg_ADDRESS);
    /*发送读取请求至目标方*/
    DL_I2C_startControllerTransfer (I2C_INST、I2C_TARGET_ADDRESS、
    DL_I2C_CONTROLLER_DIRECTION_RX、I2C_RX_packet_SIZE);

    /*
    *接收来自目标的所有字节。 如果不是所有字节、LED 将保持高电平
    *已收到
    */
    for (uint8_t i = 0;I < I2C_RX_packet_size;I++){
    while (DL_I2C_isControllerRXFIFOEMty (I2C_INST))

    gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);


    以下是更新的 void I2C_read (uint8_t reg_address)函数。  

    程序卡在 时间内(DL_I2C_isControllerRXFIFOEMty (I2C_INST))

    数量。 请推荐解决方案。

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

    您好、Vaishak、

    for (uint8_t i = 0;I < I2C_RX_packet_size;I++){
    while (DL_I2C_isControllerRXFIFOEMty (I2C_INST))

    gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);

    [/报价]

    逻辑看起来异常。 我更喜欢贝洛斯:

    for (uint8_t i = 0;I < I2C_RX_packet_size;I++){

    如果 (! DL_I2C_isControllerRXFIFOEMty (I2C_INST){

    gRxPacket[i]= DL_I2C_receiveControllerData (I2C_INST);

    否则{

    中断;

    B.R.

    萨尔

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

    谢谢 Sal Ye、查询已解决。