跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1H系列
  4. MCAL环境下I2C只能执行一次问题

MCAL环境下I2C只能执行一次问题

已定时 已固定 已锁定 已移动 已解决 YTM32B1H系列
10 帖子 2 发布者 3.3k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • yxydoctorY 离线
    yxydoctorY 离线
    yxydoctor
    写于 最后由 yxydoctor 编辑
    #1

    样机上有一颗兴威帆的RTC芯片,采用的是I2C通讯,器件地址为单字节,访问地址为单字节;访问方式应该是跟官方开发板上的AT24C02类似。

    先拿MCAL库里面的I2C例程作测试,里面有一个AT24C02的I2C驱动,IAR环境下跑了一下,正常。

    之后在主循环中重复调用“写-读-比较”函数,发现只能成功一次;试着改变波特率,DMA改为中断等措施,但都是第一次成功,之后就不行了,例程中的中断函数也不知道是起什么作用的。

    其它疑问包括:
    1 - I2C的波特率一般会设置为100K-400K,取决于上拉电阻,但MCAL驱动里面附带了很多细化参数,不知道怎么调;

    2 - I2C同步方式会存在超时问题,云途MCAL的超时时间应该是循环次数而不是严格意义的时间,结合I2C具体要怎么设置?设置为多大为宜?因为I2C的超时不设置真不行;

    3 - 有没有取消从器件锁死的函数?

    附已有的I2C访问流程经验:
    1 - I2C初始化;
    2 - 访问I2C器件;
    3 - 如果超时,注销I2C重启;
    4 - 如果还不行,I2C引脚需要切换到GPIO口模式,执行取消挂死流程,之后再重新初始化。

    附测试工程
    i2c测试.zip

    1 条回复 最后回复
    0
    • yxydoctorY 离线
      yxydoctorY 离线
      yxydoctor
      写于 最后由 编辑
      #10

      明白了。
      读数据时I2c0MasterTx.BufferSize=1,重复写时I2c0MasterTx.BufferSize需还原

      1 条回复 最后回复
      0
      • FrankF 离线
        FrankF 离线
        Frank YunTu
        写于 最后由 编辑
        #2
        1. 波特率 = 频率 / (((MCLKCFG[LOW] + MCLKCFG[High] + 2 + ROUNDDOWN((2 + MFLTCFG[FLTSCL] + SCL_RISETIME) / 2^DIV)) * 2^DIV)).
        2. 超时时间跟你的通信数据长度和主频都有关系。你可以根据你的实际应用通过调试的手段获取到正常通信完成时最大的计数值,然后给这个值加一个裕量就可以了。
        3. 驱动中没有解锁总线锁死的函数,你需要将clock管脚配置为gpio然后发送9个clock就可以实现。

        Demo中的中断回调是工作在slave模式的instanse使用的。

        关于你描述的只能读写一次的问题,怀疑是你写完后从设备没有把数据处理完成,然后再次发起通信时从设备没有响应导致的(用逻辑分析仪抓下波形看从设备是否没有发送ACK响应),你需要每次通信后加适量的延时来保证。

        yxydoctorY 1 条回复 最后回复
        0
        • yxydoctorY 离线
          yxydoctorY 离线
          yxydoctor
          在 回复了 Frank 最后由 编辑
          #3

          Frank 在 MCAL环境下I2C只能执行一次问题 中说:

          关于你描述的只能读写一次的问题,怀疑是你写完后从设备没有把数据处理完成,然后再次发起通信时从设备没有响应导致的(用逻辑分析仪抓下波形看从设备是否没有发送ACK响应),你需要每次通信后加适量的延时来保证。

          例程就是官方的mcal库自带的例程。都有延时

          void Eeprom_Write_Read_Test(void)
          {
          // 1-发
          ...
          Delay((uint32)1000000);
          // 收
          ...
          // 比较
          ...
          }
          
          main()
          {
              while (1)
              {
                  TestCount++;
                  if (TestCount % 2000000 == 0U)
                  {
                      Dio_FlipChannel(DioConf_DioChannel_DioChannel_0);
                      if(tx_busy == 0){
                          tx_busy =1;
                          i2c_count[0]++; 
                          WriteToEepromBuffer[7]++;
                          Eeprom_Write_Read_Test();                
                      }            
                  }
              }
          }
          
          

          见了鬼了,第一次就可以,之后发收测试就不行。

          FrankF 1 条回复 最后回复
          0
          • FrankF 离线
            FrankF 离线
            Frank YunTu
            在 回复了 yxydoctor 最后由 编辑
            #4

            yxydoctor 延时函数加nop 或volatile 变量,搞不好编译器给优化了。

            yxydoctorY 1 条回复 最后回复
            0
            • yxydoctorY 离线
              yxydoctorY 离线
              yxydoctor
              在 回复了 Frank 最后由 编辑
              #5

              Frank
              哎,就是官方例程,并且I2C的例程就也一个。

              硬件平台也是官方开发板。

              唯一区别就是:官方例程是在while{}之前调用了一次EEPROM的写读操作,现在是周期写读,从PCB指示灯看,操作频率只有0.5s左右,很慢的。

              不信你们试一下那个I2C读写AT24C02的例程,周期写读

              1 条回复 最后回复
              0
              • FrankF 离线
                FrankF 离线
                Frank YunTu
                写于 最后由 编辑
                #6

                image.png 我测试没问题呀,你换个EVB板再测试下

                yxydoctorY 1 条回复 最后回复
                0
                • yxydoctorY 离线
                  yxydoctorY 离线
                  yxydoctor
                  在 回复了 Frank 最后由 编辑
                  #7

                  Frank
                  您测试的这个工程可否发一下?

                  1 条回复 最后回复
                  0
                  • FrankF 离线
                    FrankF 离线
                    Frank YunTu
                    写于 最后由 编辑
                    #8

                    CddI2c_Master_Slave_Demo_YTM32B1HA0.zip

                    yxydoctorY 1 条回复 最后回复
                    0
                    • yxydoctorY 离线
                      yxydoctorY 离线
                      yxydoctor
                      在 回复了 Frank 最后由 编辑
                      #9

                      Frank
                      周期测试,需要改变发送值才行

                      1 条回复 最后回复
                      0
                      • yxydoctorY 离线
                        yxydoctorY 离线
                        yxydoctor
                        写于 最后由 编辑
                        #10

                        明白了。
                        读数据时I2c0MasterTx.BufferSize=1,重复写时I2c0MasterTx.BufferSize需还原

                        1 条回复 最后回复
                        0
                        • ,FrankieF Frankie 将这个主题转为问答主题
                        • ,FrankieF Frankie 将这个主题标记为已解决

                      • 云途开发生态介绍

                        快速上手云途开发生态

                      • 云途论坛规则/Yuntu Forum Rules

                        发帖前请查看

                      • YT CONFIG TOOL调查问卷

                        帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                      • can
                        25
                        demo
                        22
                        lin stack
                        13
                        uds
                        13
                        md14
                        6
                        yt-link
                        6
                        fbl
                        5
                        adc模块
                        4
                        Online Users
                        houjun_xiaoH
                        houjun_xiao
                        OliverChenO
                        OliverChen
                        li5920oL
                        li5920o
                        QihaQ
                        Qiha
                        xianghanX
                        xianghan
                        FunchovyF
                        Funchovy
                        KirkK
                        Kirk
                        MALIM
                        MALI
                        FrankieF
                        Frankie
                        QQT-EthanQ
                        QQT-Ethan
                        ganyongchaoG
                        ganyongchao
                        YQHY
                        YQH
                        D
                        Derrick
                        ZXZ
                        ZX
                        ysogY
                        ysog
                        • 登录

                        • 登录或注册以进行搜索。
                        • 第一个帖子
                          最后一个帖子
                        0
                        • 版块
                        • 最新
                        • 标签
                        • 热门