本帖最后由 andeyqi 于 2024-1-9 10:56 编辑
适配好了I2C总线驱动,我们可以找个I2C外设试验下,正好板子上有颗AT24C32的的EEPROM,查看RT-thread 的online package 正好有AT24CXX的驱动软件包,我们直接下载该软件包来驱动板子上的EEPROM。有了软件包我们基本可以简单配置下就可以用起来了,这点是真香。
menuconfig 配置使用 at24cxx 驱动软件包:
pkgs --update 更新拉取代码
scons --target=iar 生成IAR工程
开启 IAR 工程此时AT24CXX的驱动已经加入到工程文件了
按照驱动库支持的AT24CXX 型号配置我们的芯片type。
修改配置后,我们可以使用软件包内集成的测试命令验证驱动程序,对应测试代码如下
- uint8_t TEST_BUFFER[] = "WELCOM TO RTT";
- #define SIZE sizeof(TEST_BUFFER)
- void at24cxx(int argc, char *argv[])
- {
- static at24cxx_device_t dev = RT_NULL;
- if (argc > 1)
- {
- if (!strcmp(argv[1], "probe"))
- {
- if (argc > 2)
- {
- /* initialize the sensor when first probe */
- if (!dev || strcmp(dev->i2c->parent.parent.name, argv[2]))
- {
- /* deinit the old device */
- if (dev)
- {
- at24cxx_deinit(dev);
- }
- dev = at24cxx_init(argv[2], atoi(argv[3]));
- }
- }
- else
- {
- rt_kprintf("at24cxx probe <dev_name> <AddrInput> - probe sensor by given name\n");
- }
- }
- else if (!strcmp(argv[1], "read"))
- {
- if (dev)
- {
- uint8_t testbuffer[50];
- /* read the eeprom data */
- at24cxx_read(dev, 0, testbuffer, SIZE);
- rt_kprintf("read at24cxx : %s\n", testbuffer);
- }
- else
- {
- rt_kprintf("Please using 'at24cxx probe <dev_name>' first\n");
- }
- }
- else if (!strcmp(argv[1], "write"))
- {
- at24cxx_write(dev, 0, TEST_BUFFER, SIZE);
- rt_kprintf("write ok\n");
- }
- else if (!strcmp(argv[1], "check"))
- {
- if (at24cxx_check(dev) == 1)
- {
- rt_kprintf("check faild \n");
- }
- }
- else
- {
- rt_kprintf("Unknown command. Please enter 'at24cxx0' for help\n");
- }
- }
- else
- {
- rt_kprintf("Usage:\n");
- rt_kprintf("at24cxx probe <dev_name> - probe eeprom by given name\n");
- rt_kprintf("at24cxx check - check eeprom at24cxx \n");
- rt_kprintf("at24cxx read - read eeprom at24cxx data\n");
- rt_kprintf("at24cxx write - write eeprom at24cxx data\n");
- }
- }
- MSH_CMD_EXPORT(at24cxx, at24cxx eeprom function);
复制代码- rt_err_t at24cxx_check(at24cxx_device_t dev)
- {
- uint8_t temp;
- RT_ASSERT(dev);
- temp = at24cxx_read_one_byte(dev, AT24CXX_MAX_MEM_ADDRESS - 1);
- if (temp == 0x55) return RT_EOK;
- else
- {
- at24cxx_write_one_byte(dev, AT24CXX_MAX_MEM_ADDRESS - 1, 0x55);
- rt_thread_mdelay(EE_TWR); // wait 5ms befor next operation
- temp = at24cxx_read_one_byte(dev, AT24CXX_MAX_MEM_ADDRESS - 1);
- if (temp == 0x55) return RT_EOK;
- }
- return RT_ERROR;
- }
复制代码
从测试代码可知
- 输入 at24cxx probe i2c1 0 初始化芯片
- 输入 at24cxx write 会往0地址写入"WELCOM TO RTT" 测试数据
- 输入 at24cxx read 回读写入0地址的数据
- 输入 at24cxx check 会在最高地址处写入测试数据0x55 回读验证
****参考资料****
|