查看: 264|回复: 0

[原创] 【S32K146 RT-thread】之 AT24C32 EEPROM 驱动适配

[复制链接]
  • TA的每日心情
    奋斗
    前天 13:25
  • 签到天数: 594 天

    [LV.9]以坛为家II

    51

    主题

    2222

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7062
    最后登录
    2024-4-27
    发表于 2024-1-9 10:23:58 | 显示全部楼层 |阅读模式
    本帖最后由 andeyqi 于 2024-1-9 10:56 编辑

    适配好了I2C总线驱动,我们可以找个I2C外设试验下,正好板子上有颗AT24C32的的EEPROM,查看RT-thread 的online package 正好有AT24CXX的驱动软件包,我们直接下载该软件包来驱动板子上的EEPROM。有了软件包我们基本可以简单配置下就可以用起来了,这点是真香。

    • 下载配置软件包:
    menuconfig 配置使用 at24cxx 驱动软件包:
    at24cxx_config.png


    pkgs --update 更新拉取代码

    pkgs_update.png

    scons --target=iar  生成IAR工程
    gen_iar.png



    开启 IAR 工程此时AT24CXX的驱动已经加入到工程文件了
    at24cxx_iar.png

    • 驱动配置
    按照驱动库支持的AT24CXX 型号配置我们的芯片type。

    chip_type.png



    修改配置后,我们可以使用软件包内集成的测试命令验证驱动程序,对应测试代码如下

    1. uint8_t TEST_BUFFER[] = "WELCOM TO RTT";
    2. #define SIZE sizeof(TEST_BUFFER)

    3. void at24cxx(int argc, char *argv[])
    4. {
    5.     static at24cxx_device_t dev = RT_NULL;

    6.     if (argc > 1)
    7.     {
    8.         if (!strcmp(argv[1], "probe"))
    9.         {
    10.             if (argc > 2)
    11.             {
    12.                 /* initialize the sensor when first probe */
    13.                 if (!dev || strcmp(dev->i2c->parent.parent.name, argv[2]))
    14.                 {
    15.                     /* deinit the old device */
    16.                     if (dev)
    17.                     {
    18.                         at24cxx_deinit(dev);
    19.                     }
    20.                     dev = at24cxx_init(argv[2], atoi(argv[3]));
    21.                 }
    22.             }
    23.             else
    24.             {
    25.                 rt_kprintf("at24cxx probe <dev_name> <AddrInput> - probe sensor by given name\n");
    26.             }
    27.         }
    28.         else if (!strcmp(argv[1], "read"))
    29.         {
    30.             if (dev)
    31.             {
    32.                 uint8_t testbuffer[50];

    33.                 /* read the eeprom data */
    34.                 at24cxx_read(dev, 0, testbuffer, SIZE);

    35.                 rt_kprintf("read at24cxx : %s\n", testbuffer);

    36.             }
    37.             else
    38.             {
    39.                 rt_kprintf("Please using 'at24cxx probe <dev_name>' first\n");
    40.             }
    41.         }
    42.         else if (!strcmp(argv[1], "write"))
    43.         {
    44.             at24cxx_write(dev, 0, TEST_BUFFER, SIZE);
    45.             rt_kprintf("write ok\n");
    46.         }
    47.         else if (!strcmp(argv[1], "check"))
    48.         {
    49.             if (at24cxx_check(dev) == 1)
    50.             {
    51.                 rt_kprintf("check faild \n");
    52.             }
    53.         }
    54.         else
    55.         {
    56.             rt_kprintf("Unknown command. Please enter 'at24cxx0' for help\n");
    57.         }
    58.     }
    59.     else
    60.     {
    61.         rt_kprintf("Usage:\n");
    62.         rt_kprintf("at24cxx probe <dev_name>   - probe eeprom by given name\n");
    63.         rt_kprintf("at24cxx check              - check eeprom at24cxx \n");
    64.         rt_kprintf("at24cxx read               - read eeprom at24cxx data\n");
    65.         rt_kprintf("at24cxx write              - write eeprom at24cxx data\n");

    66.     }
    67. }
    68. MSH_CMD_EXPORT(at24cxx, at24cxx eeprom function);
    复制代码
    1. rt_err_t at24cxx_check(at24cxx_device_t dev)
    2. {
    3.     uint8_t temp;
    4.     RT_ASSERT(dev);

    5.     temp = at24cxx_read_one_byte(dev, AT24CXX_MAX_MEM_ADDRESS - 1);
    6.     if (temp == 0x55) return RT_EOK;
    7.     else
    8.     {
    9.         at24cxx_write_one_byte(dev, AT24CXX_MAX_MEM_ADDRESS - 1, 0x55);
    10.         rt_thread_mdelay(EE_TWR);                 // wait 5ms befor next operation
    11.         temp = at24cxx_read_one_byte(dev, AT24CXX_MAX_MEM_ADDRESS - 1);
    12.         if (temp == 0x55) return RT_EOK;
    13.     }
    14.     return RT_ERROR;
    15. }
    复制代码


    从测试代码可知

    • 输入 at24cxx  probe i2c1  0  初始化芯片
    • 输入 at24cxx  write 会往0地址写入"WELCOM TO RTT" 测试数据
    • 输入 at24cxx  read 回读写入0地址的数据
    • 输入 at24cxx  check 会在最高地址处写入测试数据0x55 回读验证



    • 烧写验证:

    20240108-220348.gif




    ****参考资料****

    at24cxx_datasheet.pdf (444.98 KB, 下载次数: 0)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-27 21:43 , Processed in 0.120631 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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