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.

[参考译文] CCS/TMS320F28377S:I2C、无中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/592512/ccs-tms320f28377s-i2c-without-interrupt

器件型号:TMS320F28377S
Thread 中讨论的其他器件: controlSUITE

工具/软件:Code Composer Studio

尊敬的所有人:

我在 TMS320F28377S 处理器上工作、我对此不熟悉。 我正在将 prom AT24C16与处理器连接。 我看到 控制套件中使用中断的可用示例。 但我想在不使用中断的情况下开发简单的函数。 这是我写入 I2C 的函数、它们不起作用。 我以前在 ATMEGA 控制器上的经验、因此请任何人也提供帮助。

谢谢


 空 I2CA_Init (空)
 {

 GPIO_SetupPinMux (32、GPIO_MUX_CPU1、1);
 GPIO_SetupPinMux (33、GPIO_MUX_CPU1、1);

 I2caRegs.I2CPSC.all = 6;             //预分频器-模块时需要7-12MHz
 I2caRegs.I2CCLKL = 10;               //注意:必须为非零
 I2caRegs.I2CCLKH = 5;                //注意:必须为非零
 // I2caRegs.I2CIER.All = 0x24;     //启用 SCD 和 ARDY __interrupts
 I2caRegs.I2CMDR.ALL = 0x0020;        //使 I2C 退出复位
 I2caRegs.I2CMDR.bit.Rm=0;                //禁用重复发送条件

 I2caRegs.I2CFFTX.ALL = 0x6000;      //启用 FIFO 模式和 TXFIFO
 I2caRegs.I2CFFRX.ALL = 0x2040;      //启用 RXFIFO、清除 RXFFINT、
 返回;
 }
 
 
 void write_i2c (无符号字符地址、无符号字符数据)
 {
 while (I2caRegs.I2CMDR.bit.STP = 1)         //等待 i2c 总线结束任何恢复通信
   
 I2caRegs.I2CSAR.All=地址;   
   
 while (I2cRegs.I2CSTR.bit.BB = 1);           //等待总线空闲
       
 I2caRegs.I2CDXR.all =0x00;               //写入要放置数据的地址
 I2caRegs.I2CDXR.all =数据;
                   
  返回;    
 }
 
 unsigned char read_i2c (unsigned char 地址)
 {
  unsigned char 数据;    
     
  while (I2caRegs.I2CMDR.bit.STP = 1)         //等待 i2c 总线结束任何恢复通信
     
  I2caRegs.I2CSAR.All=地址;   
     
  while (I2cRegs.I2CSTR.bit.BB = 1);           //等待总线空闲
  
  Data=I2caRegs.I2CDRR.All;                       //读取数据表单
   
 返回数据;
 }
 
 void start_condition (void)
 {
 I2caRegs.I2CMDR.bit.STT=1;                   //发送起始条件      
 
 while (I2cRegs.I2CSTR.bit.BB = 1);           //等待总线空闲
 
 返回;    
 }
 
 void stop_condition (void)
 {
 I2caRegs.I2CMDR.bit.STP=1;                   //发送停止条件      
      
 while (I2cRegs.I2CSTR.bit.BB = 1);           //等待总线空闲
 
 返回;    
 }
 

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

    您是否已检查 controlSUITE 下路径中可用的 I2C_Boot.c 文件。 此 I2C 代码不使用中断。

    路径    : libs\utilities\boot_rom\F2837x_revB\RevB_rom_sources\F2837x_bootrom\cpu01-bootrom\sources\

    来源:I2C_Boot.c


    此致、

    曼诺伊

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

    谢谢、

    我会按照您的建议尝试。 我编写以下代码以使用 I2C。 但这仍然不起作用。 即使 I2C 时钟也不会产生、我为上拉 sda 和 SCL 输入4.7K。 因此、请帮助我找出是不是我犯了错误。

    I2C_init1();

    //  GPIO_SetupPinMux (32、GPIO_MUX_CPU2、0);                //SCK
    //  GPIO_SetupPinOptions (32、GPIO_output、GPIO_PushPull);      // CS1

    //  GPIO_SetupPinMux (33、GPIO_MUX_CPU2、0);                //sda
    //  GPIO_SetupPinOptions (33、GPIO_output、GPIO_PushPull);      // CS2
      Data=I2C_CheckKeyVal ();

       while (1)    //这在主体中
      {

          Data=I2C_CheckKeyVal ();
        //data= EEPROM_Read (0x10);

       //   GPIO_WritePin (92、1);GPIO_WritePin (91、1);
           delay_ms (100);
       //   GPIO_WritePin (92、0);GPIO_WritePin (91、0);
          delay_ms (100);
      }


     //####################################
     // void I2C_Pinmux_Option2 (void)
     //--------------------------------
     //此例程配置 GPIO32和 GPIO32
     //作为 I2C 引脚:-
     //   1)在 GPIO32和 GPIO33上启用上拉
     //   2)将 GPIO32配置为 SDAA 引脚
     //   3)将 GPIO33配置为 SCLA 引脚
     //   4)将 GPIO32 & GPIO33配置为异步 I/O
     //--------------------------------

     UINT16 I2C_CheckKeyVal (空)
     {
       //要从 EEPROM 读取一个字,必须在中先给出一个地址
       //主发送器模式。 然后执行重新启动、数据可以
       //在主接收器模式下读回。
       I2caRegs.I2CCNT = 0x02;             //设置要发送的字节数
       I2caRegs.I2CDXR.ALL = 0x00;             //为字节配置 FIFO 数据
       I2caRegs.I2CDXR.ALL = 0x00;             //  地址0x0000

       I2caRegs.I2CMDR.ALL = 0x2620;      //发送数据到设置 EEPROM 地址

       while (I2caRegs.I2CSTR.bit.ARDY = 0)//等待通信
       {                            //  完成并准备好寄存器
         ;
       }

       如果(I2caRegs.I2CSTR.bit.nack = 1)   //设置停止位&返回错误 if
       {                            //   收到 NACK
          I2caRegs.I2CMDR.bit.STP= 1;
          返回0;
       }

       //检查以确保收到的密钥值正确
        if (I2C_GetWord ()!= 0x08AA){return 0;}

       返回1;
     }



     unsigned int i2c_init1 (void)
     {
          if (DevCfgRegs.DC10.bit.I2C_A!= 0x01)         //检查天气情况 I2C 是否可用
          {
             返回0xFFFFFFFF;
          }

             //将 GetWordData 分配给的 I2C-A 版本
             //功能。  GetWordData 是函数的指针。
             //GetWordData = I2C_GetWord;

            EALLOW;
            CpuSysRegs.PCLKCR9.bit.I2C_A = 1;   //打开 I2C 模块时钟
            EDIS;

            //初始化主发送器模式下的 I2C
            I2caRegs.I2CSAR.ALL = 0x0050;   //从地址- EEPROM 控制代码
            I2caRegs.I2CPSC.all = 0;         // I2C 时钟应该在7MHz-12MHz 之间
            I2caRegs.I2CCLKL = 43;         //预分频器设置为100kHz 位速率
            I2caRegs.I2CCLKH = 43;         //在10MHz I2C 时钟上

            I2caRegs.I2CMDR.ALL = 0x0620;   //主发送器
                                       //使 I2C 退出复位
                                       //暂停时停止

            I2caRegs.I2CFFTX.ALL = 0x6000;   //启用 FIFO 模式和 TXFIFO
            I2caRegs.I2CFFRX.ALL = 0x2000;   //启用 RXFIFO

            I2C_Pinmux_Option1 ();                      //为 I2C 配置 GPIO
     返回(0x00);
     }


     void I2C_Pinmux_Option1 (void)
     {
        EALLOW;
         GpioCtrlRegs.GPCPUD.ALL &= 0xE7FFFFFF;

         GpioCtrlRegs.GPCGMUX2.ALL |= 0x01400000;
         GpioCtrlRegs.GPCMUX2.ALL |= 0x02800000;

         GpioCtrlRegs.GPCQSEL2.all |= 0x03C00000;
        EDIS;
     }


     UINT16 I2C_GetWord (空)
     {
       UINT16低字节;

       I2caRegs.I2CCNT = 2;                //设置预期的字节数
       I2caRegs.I2CMDR.ALL = 0x2C20;      //作为主接收器发送启动信号

       //等待通信完成
       while (I2caRegs.I2CMDR.bit.STP==1){}

       //将两个字节合并到一个字并返回
       低字节= I2caRegs.I2CDRR.all;
       返回(低字节|(I2caRegs.I2CDRR.All<8));
     }




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所有 I2C 寄存器受 EALLOW 保护。 当您配置 I2C 时、EALLOW 似乎被禁用。 因此、您的代码未配置 I2C。

    确保在执行 I2C config 语句之前执行 EALLOW 指令。 此外、当您单步执行代码时、请检查您是否正在对存储器窗口中的 I2C 寄存器进行配置。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此问题是否已解决? 我可以关闭此 TT 吗?