查看: 2055|回复: 2

[已解决] 友友们,我又来请教问题了,关于K60的IIC

[复制链接]
  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-9-19 00:41:11 | 显示全部楼层 |阅读模式
    我用IIC去读写AT24C16,先写入一串ASCII码"0x01","0x02","0x03","0x04","0x05",然后再按顺序把他们读出来,通过串口发送到上位机,但是得到的数据第一、二字节总是0xFF,0xFF,然后从第三字节开始才是"0x03","0x04","0x05。我的代码如下:

    IIC基本操作用宏定义:

    1. #define i2c_Start(I2Cn)     I2C_C1_REG(I2CN[I2Cn]) |= (I2C_C1_TX_MASK | I2C_C1_MST_MASK)
    2. #define i2c_Stop(I2Cn)     I2C_C1_REG(I2CN[I2Cn]) &= ~(I2C_C1_TX_MASK | I2C_C1_MST_MASK)
    3. #define i2c_RepeatedStart(I2Cn)     I2C_C1_REG(I2CN[I2Cn]) |= I2C_C1_RSTA_MASK
    4. //进入接受模式,不发送应答
    5. #define i2c_PutinRxMode(I2Cn)     I2C_C1_REG(I2CN[I2Cn]) &= ~I2C_C1_TX_MASK; \
    6.                                                   I2C_C1_REG(I2CN[I2Cn]) |= I2C_C1_TXAK_MASK
    7. #define i2c_Wait(I2Cn) do \
    8.                                     { \
    9.                                         while((I2C_S_REG(I2CN[I2Cn]) & I2C_S_IICIF_MASK) == 0){}; \
    10.                                                 I2C_S_REG(I2CN[I2Cn]) |= I2C_S_IICIF_MASK; \
    11.                                     }while(0)
    12. #define i2c_write_byte(I2Cn,data)  do \
    13.                                                  { \
    14.                                                                I2C_D_REG(I2CN[I2Cn]) = (data); \
    15.                                                                i2c_Wait(I2Cn); \
    16.                                                  }while(0)
    复制代码
    然后写一串数据函数如下,在24C16的第0页第0字节开始写:
    1. void i2c_MultiWR_EEPROM()
    2. {
    3.         i2c_Stop(I2C0e);
    4.     i2c_Start(I2C0e);
    5.         i2c_write_byte(I2C0e, 0xa0);
    6.         i2c_write_byte(I2C0e, 0x00);
    7.        
    8.         i2c_write_byte(I2C0e, 0x01);
    9.         i2c_write_byte(I2C0e, 0x02);
    10.         i2c_write_byte(I2C0e, 0x03);
    11.         i2c_write_byte(I2C0e, 0x04);
    12.         i2c_write_byte(I2C0e, 0x05);
    13.         i2c_write_byte(I2C0e, 0x06);
    14.         i2c_write_byte(I2C0e, 0x07);
    15.         i2c_write_byte(I2C0e, 0x08);
    16.         i2c_write_byte(I2C0e, 0x09);
    17.         i2c_write_byte(I2C0e, 0x0a);
    18.         i2c_Stop(I2C0e);
    19.         Pause();
    20. }
    复制代码
    然后读函数如下:
    1. uint8_t i2c_read_reg(I2Cn_e i2cn, uint8_t SlaveID, uint8_t reg)
    2. {
    3.         uint8_t result;
    4.        
    5.         ASSERT((SlaveID & 0x80) == 0);
    6.   
    7.         i2c_Start(i2cn);
    8.         i2c_write_byte(i2cn,(SlaveID << 1)|MWSR);       
    9.         i2c_write_byte(i2cn,reg);
    10.     i2c_RepeatedStart(i2cn);
    11.         i2c_write_byte(i2cn, (SlaveID << 1)|MRSW);
    12.         i2c_PutinRxMode(i2cn);
    13.         result = I2C_D_REG(I2CN[i2cn]);
    14.        
    15.         i2c_Wait(i2cn);
    16.        
    17.         i2c_Stop(i2cn);
    18.        
    19.         result = I2C_D_REG(I2CN[i2cn]);
    20.        
    21.        
    22.         Pause();
    23.        
    24.         return result ;
    25. }
    复制代码
    主函数如下:
    1. i2c_MultiWR_EEPROM();
    2.        
    3.         dataRec = i2c_read_reg(I2C0e, 0x50, 0x00);
    4.         uart_putchar(UART1e,dataRec);
    5.         dataRec = i2c_read_reg(I2C0e, 0x50, 0x01);
    6.         uart_putchar(UART1e,dataRec);
    7.         dataRec = i2c_read_reg(I2C0e, 0x50, 0x02);
    8.         uart_putchar(UART1e,dataRec);
    9.         dataRec = i2c_read_reg(I2C0e, 0x50, 0x03);
    10.         uart_putchar(UART1e,dataRec);
    11.         dataRec = i2c_read_reg(I2C0e, 0x50, 0x04);
    12.         uart_putchar(UART1e,dataRec);
    13.         dataRec = i2c_read_reg(I2C0e, 0x50, 0x05);
    14.         uart_putchar(UART1e,dataRec);
    复制代码
    24C16的地址与读写时序如下图:
    捕获1.PNG
    捕获2.PNG
    捕获3.PNG
    捕获4.PNG
    捕获5.PNG

    有没有友友遇到同样的问题呢?我对了半天的时序,没问题呀!!















    我知道答案 目前已有2人回答
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
     楼主| 发表于 2015-9-19 09:59:49 | 显示全部楼层
    有知道的么
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
     楼主| 发表于 2015-9-19 22:06:58 | 显示全部楼层
    找到问题所在了,K60的IIC模块每次读之间需要一段延时,之前延时 太小了,只有50个NOP指令,后来改成20000个NOP指令,就可以了。
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-29 04:46 , Processed in 0.087359 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表