打印
[技术问答]

关于赛元8617的TWI功能读写外部EEPROM 24C02的问题,恳请大神...

[复制链接]
1241|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
56007904|  楼主 | 2020-5-28 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 56007904 于 2020-5-28 16:20 编辑

大家好,最近在研究赛元的8617 TWI功能读写外部EEPROM  24C02的问题,没有调通,无法正常读写!恳请搞过赛元的大神指教!代码如下:void main(void)
{
  unsigned char rd_eeprom;
        Uart0Init();
  USCI0_TWI_Init();        
        Uart2_Uart_Init();
        Timer0Init();
        enableInterrupts();        
        TWIBUS_ByteWrite(EEPROM_ADDR,0x01, 0x55);        
        while(1)
        {
                rd_eeprom = TWIBUS_ByteRead(EEPROM_ADDR,0x01);
                if(rd_eeprom == 0x55)
                {
                        UART0_Send_String(send_cmd,8);
                }
  }
}

其中USCI0_TWI_Init()如下:
void USCI0_TWI_Init()
{
        USCI0_TWI_MasterCommunicationRate(USCI0_TWI_256); //125K 设置IIC时钟频率
        USCI0_TWI_AcknowledgeConfig(ENABLE);        //使能应答
        USCI0_TWI_Cmd(ENABLE);//TWI功能开关函数 开启TWI功能
        USCI0_ITConfig(ENABLE, LOW);//开启USCI0功能        
}

关于24C02的写时序如下:
//===============向TWI总线上写入一个数据==============//
void TWIBUS_ByteWrite(unsigned char SLAVE_ADDR,unsigned char addr, unsigned char dat)
{
    USCI0_TWI_Start(); //产生起始信号
          while(!TWI0Flag);
          TWI0Flag = 0;
          USCI0_TWI_SendData(SLAVE_ADDR); //发送从机地址 A0
          while(!TWI0Flag);
                TWI0Flag = 0;
          USCI0_TWI_SendData(addr);         //发送地址
          while(!TWI0Flag);
                TWI0Flag = 0;
          USCI0_TWI_SendData(dat);         //发送数据
          while(!TWI0Flag);
                TWI0Flag = 0;
          Delay(100);    // 系统延时
                USCI0_TWI_MasterModeStop();        //停止位
          Delay(100);    // 系统延时
}
关于24C02的读时序如下:
//==================================从TWI总线上读入一个数据=================================//
unsigned char TWIBUS_ByteRead(unsigned char SLAVE_ADDR,unsigned char addr)
{
          uint8_t TWI_Read_dat;
    USCI0_TWI_Start(); //产生起始信号
          while(!TWI0Flag);
          TWI0Flag = 0;
          USCI0_TWI_SendData(SLAVE_ADDR); //发送从机地址 A0
          while(!TWI0Flag);
                TWI0Flag = 0;
          USCI0_TWI_SendData(addr);         //发送地址
          while(!TWI0Flag);
                TWI0Flag = 0;        

         
          USCI0_TWI_Start(); //产生起始信号
          while(!TWI0Flag);
          TWI0Flag = 0;
          USCI0_TWI_SendData(0xa1);         //发送地址
          while(!TWI0Flag);
                TWI0Flag = 0;        
          TWI_Read_dat = USCI0_TWI_ReceiveData( );
          Delay(100);    // 系统延时
                USCI0_TWI_MasterModeStop();        //停止位
                Delay(100);    // 系统延时
          return TWI_Read_dat ;
}
串口TWI中断配置如下:
void USCI0Interrupt()                        interrupt 7
{
        if(US0CON0&0x40)
        {
                US0CON0 &= 0xbf;  //中断清零
                TWI0Flag = 1;
        }                        
}

使用特权

评论回复

相关帖子

沙发
赛元MCU3| | 2020-5-28 18:20 | 只看该作者
您好,通过查看您这段程序,没有看出什么问题,您可以加一下赛元的技术支持QQ:2131132845,将完整的程序发送给相关人员并描述一下目前遇到的问题的具体现象。

使用特权

评论回复
板凳
56007904|  楼主 | 2020-5-29 10:04 | 只看该作者
赛元MCU3 发表于 2020-5-28 18:20
您好,通过查看您这段程序,没有看出什么问题,您可以加一下赛元的技术支持QQ:2131132845,将完整的程序发 ...

已发至技术,谢谢支持!同时也在研究IAP的操作,替代EEPROM!

使用特权

评论回复
地板
56007904|  楼主 | 2020-6-6 00:32 | 只看该作者
IAP功能是可以用的,这个TWI读24C02为啥不成功呢?折磨了几天了,没有调通!很无语……

使用特权

评论回复
5
赛元MCU3| | 2020-6-10 09:17 | 只看该作者
56007904 发表于 2020-6-6 00:32
IAP功能是可以用的,这个TWI读24C02为啥不成功呢?折磨了几天了,没有调通!很无语…… ...

您那边有联系我们技术支持QQ的客服人员沟通吗?

使用特权

评论回复
6
隔壁坏叔叔| | 2020-6-11 12:43 | 只看该作者
在接收数据前发个NACK试下?

使用特权

评论回复
评论
隔壁坏叔叔 2020-6-11 17:15 回复TA
@56007904 : USCI0_TWI_AcknowledgeConfig(DISABLE); 加在读取数据前看看,还有,在发完地址和重新启动前加个延时看看? 
56007904 2020-6-11 13:35 回复TA
求教,求教!问题还没解决…… 
7
56007904|  楼主 | 2020-6-11 13:36 | 只看该作者
赛元MCU3 发表于 2020-6-10 09:17
您那边有联系我们技术支持QQ的客服人员沟通吗?

已联系,正在解决中……

使用特权

评论回复
8
赛元MCU3| | 2020-6-12 17:14 | 只看该作者
您好,附件是我这边用SC95F861X写的与24C02实现IIC通讯的程序,程序主要实现的功能是:在24C02的0-255地址分别写入0-255的数据,然后再将数据读出来发送到电脑串口助手上;再在24C02的0-255地址分别写入255-0的数据,然后将数据读出来发送到电脑串口助手上。下图是串口小助手上面显示出来的数据:

在调试程序过程中发现一些问题,提醒一下大家,在调试过程中发现24C02的下拉能力比较强,SC95F861X在做IIC主机时无法将24C02的SCL和SDA线拉高,所以需要在24C02的SCL和SDA脚上接上拉电阻,我实验中加的是5.1K;另外在调试过程中发现24C02的通信速度是挺快的,但是每一byte数据之间要做一下延时,如果不延时会导致错误,我怀疑是由于24C02的响应速度问题,24C02每收到一byte数据就会根据数据进行相应处理,处理需要时间,所以当两个命令间隔时间很短时24C02会处理不过来,导致出错,尤其是在写数据的时候,24C02需要时间做数据存储,所以不能太快,所以在每次主机发送完数据之后需要做600us左右的延时,待24C02处理完信息后再进行下一byte的通信,这样才可以正常。平时我们使用24C02的情况也不多,对这颗芯片没有深入研究,以上只是我个人的理解,如果有对24C02比较熟悉的坛友,欢迎多多指教。另外,我们SC95F861X由于start信号以及stop信号的时间太短,为了使从机可以正常响应一般需要在start信号以及stop信号之后需要做一段时间的延时,来拉长start信号和stop信号。

95F8X1X读写24C02.rar

96.78 KB

使用特权

评论回复
9
赛元MCU3| | 2020-6-12 17:16 | 只看该作者
您好,附件是我这边用SC95F861X写的与24C02实现IIC通讯的程序,程序主要实现的功能是:在24C02的0-255地址分别写入0-255的数据,然后再将数据读出来发送到电脑串口助手上;再在24C02的0-255地址分别写入255-0的数据,然后将数据读出来发送到电脑串口助手上。下图是串口小助手上面显示出来的数据:

在调试程序过程中发现一些问题,提醒一下大家,在调试过程中发现24C02的下拉能力比较强,SC95F861X在做IIC主机时无法将24C02的SCL和SDA线拉高,所以需要在24C02的SCL和SDA脚上接上拉电阻,我实验中加的是5.1K;另外在调试过程中发现24C02的通信速度是挺快的,但是每一byte数据之间要做一下延时,如果不延时会导致错误,我怀疑是由于24C02的响应速度问题,24C02每收到一byte数据就会根据数据进行相应处理,处理需要时间,所以当两个命令间隔时间很短时24C02会处理不过来,导致出错,尤其是在写数据的时候,24C02需要时间做数据存储,所以不能太快,所以在每次主机发送完数据之后需要做600us左右的延时,待24C02处理完信息后再进行下一byte的通信,这样才可以正常。平时我们使用24C02的情况也不多,对这颗芯片没有深入研究,以上只是我个人的理解,如果有对24C02比较熟悉的坛友,欢迎多多指教。另外,我们SC95F861X由于start信号以及stop信号的时间太短,为了使从机可以正常响应一般需要在start信号以及stop信号之后需要做一段时间的延时,来拉长start信号和stop信号。

95F8X1X读写24C02.rar

96.78 KB

使用特权

评论回复
10
xys9190| | 2020-6-14 08:27 | 只看该作者
本帖最后由 xys9190 于 2020-6-14 08:29 编辑

你借个逻辑分析仪吧,I2C通信的交互波形贴出来吧,再一段段查具体通信哪里的问题。项目开发 18665321219

184325ee56e870fbc1.png (1.2 KB )

184325ee56e870fbc1.png

5795ee56e93644c3.png (1.11 KB )

5795ee56e93644c3.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝