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.

[参考译文] I2C模块设置需要帮助

Guru**** 2585275 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/654713/i2c-module-setup-need-help

主题中讨论的其他部件:TMS320F2.802万

您好:

我需要EEPROM来存储有关控制电机的参数。   但粘贴了很多天,我无法做到,因为它对TI器件中的I2C非常困惑。  即使controlSuit有示例。   

但 示例不是应用程序的通用编码器。  它在状态机中非常混乱。   如果发送编号超过2,   则不起作用 。

因此,我重新编码自己的程序 ,但无法读取。      我请求有人帮我检查我的代码。

注:  写入程序正常,未被卡住。但读取函数卡在   “ while (I2caRegs.I2CSTR.bit.XRDY ==0){}; ”中。

下面是我的代码:

Void I2CA_Init (void)

  //初始化I2C
  I2caRegs.I2CMDR.All = 0x0000;
  I2caRegs.I2CSAR = 0;    //从属地址

  I2caRegs.I2CPsc.all = 6;                //预分频器-需要7-12 MHz的模块clk
  I2caRegs.I2CCLKL = 10;                  //注意:必须为非零
  I2caRegs.I2CCLKH = 5;                   //注意:必须为非零

  //I2caRegs.I2CIER = 0x24;           //启用SCD和ARDY中断 0010 0100
  I2caRegs.I2CIER.bit.AAS =0;            //作为从属中断启用位寻址
  I2caRegs.I2CIER.bit.SCD =0;            //停止条件检测到中断启用位
  I2caRegs.I2CIER.bit.XRDY =0;//           发送数据就绪中断启用位
  I2caRegs.I2CIER.bit.RRDY =0;           //接收数据就绪中断启用位
  I2caRegs.I2CIER.bit.ARDY =0;//           寄存器-存取-就绪中断启用位
  I2caRegs.I2CIER.bit.nack = 0;           //不确认中断启用位
  I2caRegs.I2CIER.bit.ARBL =0;//           仲裁丢失中断启用位

  //I2caRegs.I2CMDR.ALL = 0x0020;         //取消I2C重置,暂停I2C
  I2caRegs.I2CMDR.bit.NACKMOD = 0;        // nack模式位
  I2caRegs.I2CMDR.bit.free = 0;           //暂停时停止I2C
  I2caRegs.I2CMDR.bit.STT = 0;            //启动条件位
  I2caRegs.I2CMDR.bit.stp = 0;            //停止条件位
  I2caRegs.I2CMDR.bit.MST = 0;            //从属模式
  I2caRegs.I2CMDR.bit.TRX = 0;            //接收器模式
  I2caRegs.I2CMDR.bit.XA = 0;             // 7位寻址模式
  I2caRegs.I2CMDR.bit.RM = 0;             //非重复模式
  I2caRegs.I2CMDR.bit.DLB =0;            //禁用数字回送模式
  I2caRegs.I2CMDR.bit.IRS = 1;            // I2C模块已启用
  I2caRegs.I2CMDR.bit.STB = 0;            // I2C模块不在起始字节模式中
  I2caRegs.I2CMDR.bit.FDF = 0;            //禁用自由数据格式模式
  I2caRegs.I2CMDR.bit.BC = 0;             //每个数据字节8位

  //I2caRegs.I2CFFTX.ALL = 0x6000;        //启用FIFO模式和TXFIFO
//  I2caRegs.I2CFFTX.bit.I2CFFEN = 1;       //启用I2C FIFO模式
//  I2caRegs.I2CFFTX.bit.TXFFRST = 1;       //启用传输FIFO操作

  //I2caRegs.I2CFFTX.ALL = 0x0000;        //禁用FIFO模式和TXFIFO
  I2caRegs.I2CFFTX.Bit.I2CFFEN = 0;       //启用I2C FIFO模式
  I2caRegs.I2CFFTX.Bit.TXFFRST = 0;       //启用传输FIFO操作
  I2caRegs.I2CFFTX.bit.TXFFINTCLR = 0;    //清除TXFFINT标志
  I2caRegs.I2CFFTX.Bit.TXFFIENA = 0;      // TXFFINT标志在设置时不生成中断
  I2caRegs.I2CFFTX.Bit.TXFFIL = 0;        //传输FIFO中断级别

  //I2caRegs.I2CFFRX.ALL = 0x2040;        //启用RXFIFO,清除RXFFINT
//  I2caRegs.I2CFFRX.bit.RXFFRST = 1;       //启用接收FIFO操作
//  I2caRegs.I2CFFRX.bit.RXFFINTCLR = 1;    //清除RXFFINT标志

  //I2caRegs.I2CFFRX.ALL = 0x000;        //禁用RXFIFO,清除RXFFINT
  I2caRegs.I2CFFRX.bit.RXFFRST = 0;       //启用接收FIFO操作
  I2caRegs.I2CFFRX.bit.RXFFINTCLR = 0;    //清除RXFFINT标志
  I2caRegs.I2CFFRX.bit.RXFFIENA = 0;      // RXFFINT标志在设置时会生成中断
  I2caRegs.I2CFFRX.bit.RXFFIL = 0;        //接收FIFO中断级别

}

Void WriteEeEe (I2caHandle p)

   uINT8_t i;
   //////////////////////////////////
   //将数据写入EEPROM //
   //////////////////////////////////
   //I2C_SLAVE_ADDR = EEPROM的0x50地址
   //我将'h','e','l','l','o'写入EEPROM,然后稍后再读回
   //I2C_NUMBYTES = 5
   //[MemoryHighAddr:MemoryLowAddr]- EEPROM中要读/写的地址
   //Data[]有单词'hello',RxdData[]将存储从EEPROM读取的数据
      I2caRegs.I2CSAR = p->diviceaddress;           //设置从属地址
      I2caRegs.I2CCNT = p->numbersend+ 2;         //将计数设置为5个字符加2个地址字节
      I2caRegs.I2CDXR = p->SNhighaddress;           //发送EEPROM高地址
      I2caRegs.I2CMDR.bit.TRX = 1;                //设置为传输模式
      I2caRegs.I2CMDR.Bit.MST = 1;                //设置为主模式
      I2caRegs.I2CMDR.bit.free = 1;               //在自由模式下运行
      I2caRegs.I2CMDR.bit.stp = 1;                //内部计数器变为0时停止
      I2caRegs.I2CMDR.bit.STT = 1;                //发送起始位,传输将跟随
      while (I2caRegs.I2CSTR.bit.XRDY == 0){};     //不执行任何操作,直到数据移出
      I2caRegs.I2CDXR = p->Slowaddress;            //发送EEPROM低地址

      对于(i = 0;i < p->numbersend;I++){
       while (I2caRegs.I2CSTR.bit.XRDY == 0){};    //不执行任何操作,直到数据移出
       I2caRegs.I2CDXR = p->sendmemory[i];                 //发送邮件
      }
返回;
}

空读EEn (I2caHandle p)

   uINT8_t i;
   //////////////////////////////////
   //从eeprom读取数据//
   //////////////////////////////////
      I2caRegs.I2CSAR = p->diviceaddress;           //设置从属地址
      I2caRegs.I2CCNT =2;                        //将计数设置为2个地址字节
      I2caRegs.I2CDXR = p->Rhightaddress;           //发送EEPROM高地址
      I2caRegs.I2CMDR.bit.TRX = 1;                //设置为传输模式
      I2caRegs.I2CMDR.Bit.MST = 1;                //设置为主模式
      I2caRegs.I2CMDR.bit.free = 1;               //在自由模式下运行
      I2caRegs.I2CMDR.bit.stp = 0;                //不要在Tx之后释放总线
      I2caRegs.I2CMDR.bit.STT = 1;                //发送起始位,传输将跟随

      while (I2caRegs.I2CSTR.bit.XRDY == 0){};     //不执行任何操作,直到数据移出
      I2caRegs.I2CDXR = p->Rlowaddress;            //发送EEPROM low address
      I2caRegs.I2CCNT = p->numberarive;             //从EEPROM读取5个字节
      I2caRegs.I2CMDR.bit.TRX = 0;                //设置为接收模式
      I2caRegs.I2CMDR.Bit.MST = 1;                //设置为主模式
      I2caRegs.I2CMDR.bit.free = 1;               //在自由模式下运行
      I2caRegs.I2CMDR.bit.stp = 1;                //内部计数器变为0时停止
      I2caRegs.I2CMDR.bit.STT = 1;//重复启动,接收将跟随
      对于(i = 0;i < p->numberarive;i++)
      {
       I2caRegs.I2CSTR.bit.RRDY ==0){};//I2CDRR    未准备就绪,是否可以读取?
       p->arrivermemory[i]= I2caRegs.I2CDRR;
      }
 返回;
}

在I2C.h中,有:

typedef结构

    void (*writeEEprom)(void*);
    void (*readEEprom)(void*);
    uINT8_t直径地址; //  eeprom设备地址
    UINT8_t突出地址;  // 发送数据地址高
    UINT8_t Slowaddress;   // 发送数据地址低
    UINT8_t高地址;//  接收数据地址高
    UINT8_t Rlowaddress;  //  接收数据地址低
    uINT16_t numbersend; //  发送数据个数
    uINT16_t numberarive; //  接收数据个数
    SENDI2CSTATE_STAT_e outi2cstate;//发送状态
    ARRIVEI2CSTATE_STAT_e ini2cstate;//接收状态
    uINT8_t * sendmemory;//  发送数组指针
    UINT8_t * arrivermemory; // 接收数组指针
} I2CA_1;

typedef I2CA_1 * I2caHandle;

#define I2C_DEFAULT {\   
   (void(*)(void*)))WriteEeEeEn,\
   (void(*)(void*)))ReadEee,\
   0x50,\
   0x00,\
   0x00,\
   0x00,\
   0x00,\
   10,\
   10,\
   SENDINACTIVE,\
   RIVERINACTIVE,\
   EepromBuff,\
   EepromBuffin
}

在main.c中:

           I2c_modul.writeeprom (myI2c); //
           DELAY _US (100);
           I2c_modul.readEEprom (myI2c);//

           //空闲循环。 只需坐下来永远循环:
               For (;;) //无限循环
               {
                   BackTicker++;

                   //国家机器入口和出口点
                   //===================================================================================================================
                   (*Alpha_State_PTR)();//  跳至Alpha状态(A0,B0,...)
                   //===================================================================================================================

               }

有人能帮我检查一下吗?哪里错了?

祝您一切顺利

谢谢

猎人

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

    您能否告诉我们您正在使用的设备(部件号)?

    谢谢,此致,
    Veena
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Veena。
    谢谢,我刚才解决了。
    我使用TMS320F2.802万。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    很高兴问题得到解决。
    我将此线程标记为已解决和已关闭

    谢谢,此致,
    Veena