查看: 2840|回复: 9

[分享] LY_KL26Z板学习之I2C总线的24C64

[复制链接]
  • TA的每日心情
    开心
    2019-7-11 19:28
  • 签到天数: 141 天

    连续签到: 1 天

    [LV.7]常住居民III

    34

    主题

    1067

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2492
    最后登录
    2020-9-16
    发表于 2015-10-4 11:05:31 | 显示全部楼层 |阅读模式
    这个功能是在原有的I2C功能上更改的,原板用的是AT24C02,  页写和地址方式 的AT24C64有些区别,这里做子一些改动1, 先在硬件上的 AT24C02更换成 AT24C64,如果不好更换可以外接, 地址线要做一下处理 ,第是A0要接VCC与原有的板子地址不能一样
    2, 在源码地改成 写入地址方式
    附源码:

    1. /*******************************************************************/
    2. /*!
    3. * Write a byte of Data to specified register on MMA7660
    4. * @param u8RegisterAddress is Register Address
    5. * @param u8Data is Data to write
    6. *  C64芯片 unsigned char  u8RegisterAddress 更换成 unsigned int  u8RegisterAddress
    7. */
    8. void I2C0WriteMultiRegister(unsigned char SlaveAddr, unsigned int  u8RegisterAddress,  char *u8Data, unsigned int length)
    9. {
    10.     uint16 i;
    11.   /* send data to slave */
    12.         //MWSR =write   MRSW =read
    13.   IIC0_StartTransmission(SlaveAddr,MWSR);
    14.   i2c0_Wait();//等待
    15. //要写入的地址        高位
    16.   I2C0_D = u8RegisterAddress>>8;       
    17.   i2c0_Wait();
    18. //要写入地址  低位
    19.         I2C0_D = u8RegisterAddress;       
    20.   i2c0_Wait();
    21.   //进入连续写入内容,这里和芯片的页写有关系,如果是C02 每次最多只能写入8个字节
    22. //如果是C64 ,每次可以最多写入 32个字节内容
    23.   for(i=0; i<length; i++)
    24.   {
    25.       I2C0_D = u8Data[i];
    26.       i2c0_Wait();
    27.   }
    28.   
    29.   i2c0_Stop();
    30.   
    31.   Pause(7);
    32.   //Pause(50);
    33. }
    复制代码
    2,在读取的地方更改

    1. /*******************************************************************/
    2. /*!
    3. * Read first three registers from the MMA7660
    4. * @param u8RegisterAddress is Register Address
    5. * @return Data stored in Register
    6. *        C64芯片 unsigned char  u8RegisterAddress 更换成 unsigned int  u8RegisterAddress
    7. */
    8. unsigned char I2C0ReadMultiRegisters(unsigned char SlaveAddr, unsigned int u8RegisterAddress, unsigned char bytes, char buf[])
    9. {
    10.   unsigned char n=bytes;
    11.   int i;

    12.   // Send Slave Address 从机地址   

    13.   IIC0_StartTransmission(SlaveAddr,MWSR);
    14.   i2c0_Wait();
    15.         // Write Register Address   要写入的地址,这里如果是C02到C08用一位地址方式 ,如果是16或C256是双位地址
    16.         //这里的 u8RegisterAddress 地址更改会16位双8位地址
    17.   /* Write Register Address */
    18.   I2C0_D = u8RegisterAddress>>8;
    19.   i2c0_Wait();
    20.        
    21.   I2C0_D = u8RegisterAddress;
    22.   i2c0_Wait();
    23.   /* Do a repeated start */
    24.   I2C0_C1 |= I2C_C1_RSTA_MASK;

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

    28.   /* Put in Rx Mode */
    29.   I2C0_C1 &= (~I2C_C1_TX_MASK);

    30.   /* Ensure TXAK bit is 0 */
    31.   I2C0_C1 &= ~I2C_C1_TXAK_MASK;

    32.   /* Dummy read */
    33.   result[0] = I2C0_D ;
    34.   i2c0_Wait();

    35.   for(i=0;i<n-2;i++)
    36.   {
    37.     /* Read first byte */
    38.     buf[i] = I2C0_D;
    39.     i2c0_Wait();
    40.   }
    41.   /* Turn off ACK since this is second to last read*/
    42.   I2C0_C1 |= I2C_C1_TXAK_MASK;

    43.   /* Read second byte */
    44.   buf[i++] = I2C0_D;
    45.   i2c0_Wait();

    46.   /* Send stop */
    47.   i2c0_Stop();

    48.   /* Read third byte */
    49.   buf[i++] = I2C0_D;

    50. //  printf("%3d    %3d     %3d\n",result[0],result[2],result[4]);
    51.   return result[0];
    52. }
    复制代码
    3,在main()做测试
    1. /*********************************************************************************************************
    2. ** Function name:           main
    3. ** Descriptions:            I2C驱动EEPROM AT24C02 Demo
    4. ** input parameters:        none
    5. ** output parameters:       none
    6. ** Returned value:          none
    7. ** Created by:              
    8. ** Created Date:           
    9. **--------------------------------------------------------------------------------------------------------
    10. ** Modified by:
    11. ** Modified date:
    12. *********************************************************************************************************/
    13. int  main (void)
    14. {
    15.     char ucData[64] = {0x00};
    16.     INT8U i = 0;
    17.     SystemCoreClockUpdate();
    18.      SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK                                  /* 管脚时钟初始化               */
    19.                   | SIM_SCGC5_PORTB_MASK
    20.                   | SIM_SCGC5_PORTD_MASK
    21.                   | SIM_SCGC5_PORTE_MASK );  
    22.     uart0Init(9600,0,0,8,1);
    23.     printf("IIC Test start\r\n");                                                        /* I2C外设初始化                */
    24.                 init_I2C0();
    25.     IO_FUN_SEL(MKL_PORTB,18,1);                                           /* LED5,6,7初始化                    */
    26.     IO_FUN_SEL(MKL_PORTB,19,1);
    27.     IO_FUN_SEL(MKL_PORTD,1,1);   
    28.      
    29.     GPIO_DDR_OUTPUT(MKL_PORTB,18);
    30.     GPIO_DDR_OUTPUT(MKL_PORTB,19);
    31.                 GPIO_DDR_OUTPUT(MKL_PORTD,1);
    32.     GPIO_CLR(MKL_PORTB,18);                                               //D5亮,程序开始
    33.     GPIO_SET(MKL_PORTB,19);
    34.                 GPIO_SET(MKL_PORTD,1);
    35.                   
    36.    
    37.     for (i = 0; i < 64; i++) {                                            /* 数组初始化                   */
    38.         ucData[i] = i;
    39.                        
    40.     }  
    41.                 printf("Now Start Write ...\n");       

    42.     I2C0WriteMultiRegister(EEPROM_I2C_ADDRESS, 0x00, ucData,64);
    43.                   
    44.     for (i = 0; i <64; i++) {                                            /* 数组初始化                   */
    45.         ucData[i] = 0;               
    46.     }                   
    47.                 printf("Now Start Read...\n");
    48.                                                                                  /* 读数据操作                   */
    49.                 I2C0ReadMultiRegisters(EEPROM_I2C_ADDRESS, 0x0000, 64,ucData);
    50.                 printf("Now Start verify...");
    51.                 for (i = 0; i < 64; i++) {
    52.         if (ucData[i] != i) {
    53.             GPIO_TOGGLE(MKL_PORTB,19);                                  /* 验证失败,D6亮           */
    54.             printf("ERR!");
    55.                                                 while (1);
    56.         }   
    57.     }                                                                   /* 验证正确,D7亮             */
    58.     GPIO_TOGGLE(MKL_PORTD,1);        
    59.      printf("OK!");
    60.                 while(1);
    61. }
    复制代码
    4,仿真结果
    124.png
    这里可以看出 第32位置 以后内容就不连续了,


    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 20:56
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    12

    主题

    449

    帖子

    0

    高级会员

    Rank: 4

    积分
    984
    最后登录
    2018-9-20
    发表于 2015-10-4 12:12:51 | 显示全部楼层
    支持一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16715
    最后登录
    1970-1-1
    发表于 2015-10-4 14:20:06 | 显示全部楼层
    多谢分享!!

    00000.jpg
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-10-4 21:29:02 | 显示全部楼层
    点赞一个
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    9

    主题

    443

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1120
    最后登录
    2016-9-23
    发表于 2015-10-4 22:27:51 | 显示全部楼层

    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2021-8-4 09:39
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    13

    主题

    677

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2307
    最后登录
    2025-5-21
    发表于 2015-10-9 11:10:01 | 显示全部楼层
    赞一个,,你是用的库开发的,还是直接操作寄存器啊
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-11 19:28
  • 签到天数: 141 天

    连续签到: 1 天

    [LV.7]常住居民III

    34

    主题

    1067

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2492
    最后登录
    2020-9-16
     楼主| 发表于 2015-10-9 11:40:31 | 显示全部楼层
    应该是库,在原有的基本上更改的
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-10-9 15:44:32 | 显示全部楼层
    谢谢分享
    freescaleic.org.png
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-4 07:07
  • 签到天数: 24 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    22

    主题

    513

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2043
    最后登录
    2018-8-15
    发表于 2015-10-10 13:10:49 来自手机 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-10-10 15:03:17 | 显示全部楼层
    赞一个              
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-29 05:02 , Processed in 0.104625 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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