查看: 5297|回复: 10

[原创] 【YL-KL26Z开发】+ IIC读写24C02

[复制链接]

该用户从未签到

42

主题

340

帖子

0

高级会员

Rank: 4

积分
722
最后登录
2016-1-9
发表于 2015-7-26 21:04:30 | 显示全部楼层 |阅读模式
接上次RTC中断翻转LED实验:https://www.nxpic.org.cn/module/forum/thread-600274-1-1.html

本次所做实验为IIC读写EEPROM,即24C02。由于之前在51上模拟过IIC,对时序方面还有印象,所以本次实验难度不大。

下面是源程序:

主程序:

for (i = 0; i < 8; i++) {                                            /* 数组初始化                   */
        ucData = i;
                        
       printf("Data = %d \r\n" , ucData);               /*将要写入EEPROM的数据在串口上显示*/
    }  

    printf("Now Start Write ...\r\n");        

    I2C0WriteMultiRegister(EEPROM_I2C_ADDRESS, 0x00, ucData,8);                /*将数据写入EEPROM*/
                  
    for (i = 0; i < 8; i++) {                                            /* 数组初始化                   */
        ucData = 0;               
    }                    

        printf("Now Start Read...\r\n");
                                                                                
       j = I2C0ReadMultiRegisters(EEPROM_I2C_ADDRESS, 0x00, 8,ucData);    /*读取EEPROM中的数据*/
       printf("DummyRead = %d\r\n",j);

        for (i = 0; i < 8; i++) {
        if (ucData != i) {
            GPIO_TOGGLE(MKL_PORTB,19);                                  /* 验证失败,D6亮           */
            printf("ERR!");
                while (1);
        }   
    }                  

    GPIO_TOGGLE(MKL_PORTD,1);                                            /* 验证正确,D7亮             */
     printf("OK!");
   while(1);


IIC初始化:

void init_I2C(void)
{
  SIM_SCGC5 = SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK |           SIM_SCGC5_PORTE_MASK;


  SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK; //开启IIC时钟

  /* 配置I/O口为IIC功能*/
  PORTC_PCR10 = PORT_PCR_MUX(2);
  PORTC_PCR11 = PORT_PCR_MUX(2);

  I2C1_F  = 0x16;       // 配置IIC时钟频率
I2C1_C1 = I2C_C1_IICEN_MASK;       /* 使能 IIC */
}


IIC读写选择:

void IIC0_StartTransmission (unsigned char SlaveID, unsigned char Mode)
{
  if(Mode == MWSR)
  {
    /* 设置为读*/
    MasterTransmission = MWSR;
  }
  else
  {
    /* 设置为写 */
    MasterTransmission = MRSW;
  }

  /* 配置从机为相应读写 */
  SlaveID = SlaveID << 1;
  SlaveID |= (unsigned char)MasterTransmission;

  /* 启动操作 */
  i2c0_Start();

  /* 写器件地址*/
  i2c0_write_byte(SlaveID);
}


IIC写操作:

void I2C0WriteMultiRegister(unsigned char SlaveAddr, unsigned char u8RegisterAddress, unsigned char *u8Data, unsigned int length)
{
    uint16 i;
  /* 写从机地址&写操作 */
IIC0_StartTransmission(SlaveAddr,MWSR);
  i2c0_Wait();       //等待写入完成

  I2C0_D = u8RegisterAddress;        //写地址
  i2c0_Wait();

  for(i=0; i<length; i++)
  {
      I2C0_D = u8Data;                 //发送数据
      i2c0_Wait();
  }

i2c0_Stop();                                //停止命令

  Pause(7);                                    //等待

}


IIC读操作:

unsigned char I2C0ReadMultiRegisters(unsigned char SlaveAddr, unsigned char u8RegisterAddress, unsigned char bytes, char buf[])
{
  unsigned char n=bytes;
  int i;

  /* Send Slave Address */
IIC0_StartTransmission(SlaveAddr,MWSR);
  i2c0_Wait();

  /* Write Register Address */
  I2C0_D = u8RegisterAddress;
  i2c0_Wait();

  /* Do a repeated start */
  I2C0_C1 |= I2C_C1_RSTA_MASK;

  /* Send Slave Address */
  I2C0_D = (EEPROM_I2C_ADDRESS << 1) | 0x01; //read address
  i2c0_Wait();

  /* Put in Rx Mode */
I2C0_C1 &= (~I2C_C1_TX_MASK);
                                                                     //设置为读操作
  /* Ensure TXAK bit is 0 */
I2C0_C1 &= ~I2C_C1_TXAK_MASK;

  /* 虚拟读 */
  result[0] = I2C0_D ;                                        //这里的操作有什么意义?
  i2c0_Wait();

  for(i=0;i<n-2;i++)
  {
    /* Read first byte */
    buf = I2C0_D;
    i2c0_Wait();
  }
  /* 非应答*/
I2C0_C1 |= I2C_C1_TXAK_MASK;

  /* Read second byte */
  buf[i++] = I2C0_D;                                   //为什么要非应答后再读次低位数据?
  i2c0_Wait();

  /* Send stop */
i2c0_Stop();

  /* Read third byte */
  buf[i++] = I2C0_D;                                  // 为什么停止操作后再读最低位数据?

        for(i = 0; i < 8; i++)
        {
          printf("ReadData = %d\r\n", buf);        //将读取的数据通过串口发送
        }

  return result[0];              //这里返回值为虚拟读的值,但是我不知道如何把读到的数组buf返回,求大神指点!!!!!
}


依照惯例,其他的程序就不贴了。和上次一样,程序关注点放在红色的部分即可。

上面那个蓝色的东西,希望有大神可以不吝赐教,非常感谢。

附手册IIC读写时序:
QQ截图20150726205328.png

这次实验由于读写速度很快就没有视频了,附一张图:
QQ截图20150726203912.png

附源工程: I2C_Master.zip (1.13 MB, 下载次数: 104)

评分

参与人数 1NXP金币 +30 收起 理由
小七 + 30 打赏!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15265
    最后登录
    1970-1-1
    发表于 2015-7-26 21:56:29 | 显示全部楼层
    楼主很专业啊:
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-3-3 09:56
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    106

    主题

    836

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    1527
    最后登录
    2023-6-12
    发表于 2015-7-26 22:50:58 | 显示全部楼层
    感谢分享,很详细。
    捕获.PNG
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-18 11:35
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    21

    主题

    945

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2001
    最后登录
    2020-6-8
    发表于 2015-7-29 10:29:39 | 显示全部楼层
    感谢分享,很详细。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-11-5 18:45
  • 签到天数: 158 天

    [LV.7]常住居民III

    26

    主题

    669

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1724
    最后登录
    2020-11-5
    发表于 2015-10-8 23:55:34 | 显示全部楼层
    谢谢分享!


    futu.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2245
    最后登录
    2024-4-12
    发表于 2015-10-12 12:43:43 | 显示全部楼层
    谢谢分享   
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    59
    最后登录
    1970-1-1
    发表于 2015-10-22 11:34:31 | 显示全部楼层
    感谢分享,学习中,谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    189

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    244
    最后登录
    2020-10-19
    发表于 2015-10-22 13:49:35 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-10-23 09:04:00 | 显示全部楼层
    楼主的是一个系列啊
    145558j4gqqxoqrpr44ogc.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    189

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    244
    最后登录
    2020-10-19
    发表于 2015-10-26 08:47:26 | 显示全部楼层
    感谢楼主分享
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-27 08:28 , Processed in 0.161120 second(s), 33 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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