i2c_sample.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-12-15 liuhy first implementation.
  9. */
  10. /*
  11. * 程序清单:这是一个 I2C 设备使用例程
  12. * 例程导出了 i2c_io_sample 命令到控制终端
  13. * 命令调用格式:i2c_io_sample
  14. * 命令解释:使用默认的I2C总线设备
  15. * 程序功能:通过 I2C 设备接收数据并打印,然后将接收的字符加1输出。
  16. */
  17. #include <rtthread.h>
  18. #include <rtdevice.h>
  19. #define I2C_BUS_NAME "i2c1" /* I2C总线设备名称 */
  20. #define SLAVE_ADDR 0x2D /* 从机地址 */
  21. #define STR_LEN 16 /* 接收发送的数据长度 */
  22. static void i2c_io_sample(int argc, char *argv[])
  23. {
  24. struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */
  25. struct rt_i2c_msg temp_msg; /* I2C消息 */
  26. rt_uint8_t buffer[STR_LEN] = { 0U };
  27. rt_uint32_t i,num_msg;
  28. rt_size_t s_stat;
  29. i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(I2C_BUS_NAME); /* 通过名字获取I2C总线设备的句柄 */
  30. if( i2c_bus == RT_NULL)
  31. {
  32. rt_kprintf("can't find i2c device :%s !\n",I2C_BUS_NAME);
  33. return;
  34. }
  35. /*初始化消息*/
  36. temp_msg.addr = SLAVE_ADDR; /* 从机地址 */
  37. temp_msg.len = STR_LEN; /* 传输的数据长度 */
  38. temp_msg.buf = buffer; /* 读写缓存器 */
  39. num_msg = 1; /* 传输一条消息 */
  40. temp_msg.flags = RT_I2C_RD; /* I2C读 */
  41. s_stat = rt_i2c_transfer(i2c_bus,&temp_msg,num_msg); /* 传输消息 */
  42. rt_thread_mdelay(400);
  43. if( s_stat == num_msg )
  44. {
  45. rt_kprintf("receive successful. \n receive messege : %s \n:",buffer);
  46. for( i = 0 ; i < STR_LEN ; i++)
  47. rt_kprintf(" %x",(unsigned int)buffer[i]);
  48. rt_kprintf("\n");
  49. }
  50. else
  51. {
  52. rt_kprintf("device s% recieve fail \n buffer : s%\n",I2C_BUS_NAME,buffer);
  53. return;
  54. }
  55. for( i = 0 ; i < STR_LEN ; i++)
  56. buffer[i]++;
  57. temp_msg.flags = RT_I2C_WR; /* I2C写 */
  58. s_stat = rt_i2c_transfer(i2c_bus,&temp_msg,num_msg); /* 传输一条 */
  59. rt_thread_mdelay(400);
  60. if( s_stat == num_msg )
  61. {
  62. rt_kprintf(" send successful \n messege : %s \n:",buffer);
  63. for( i = 0 ; i < STR_LEN ; i++)
  64. rt_kprintf(" %x",(unsigned int)buffer[i]);
  65. rt_kprintf("\n");
  66. }
  67. else
  68. {
  69. rt_kprintf("device s% send fail \n",I2C_BUS_NAME);
  70. return;
  71. }
  72. return;
  73. }
  74. /* 导出到 msh 命令列表中 */
  75. MSH_CMD_EXPORT(i2c_io_sample, i2c io sample);