[AT32F405] 【AT-START-F405测评】-1- I2C扫描设备

[复制链接]
 楼主| YangTwo 发表于 2024-5-15 20:41 | 显示全部楼层 |阅读模式
通过本程序来获取连接到I2C总线上的外围设备,实验使用的是地址为0X78的OLED。

首先初始化串口与I2C。

  1.   /* initial system clock */
  2.   system_clock_config();

  3.   /* config nvic priority group */
  4.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);

  5.   /* at board initial */
  6.   at32_board_init();
  7.         uart_print_init(115200);

  8.   hi2cx.i2cx = I2Cx_PORT;

  9.   /* i2c config */
  10.   i2c_config(&hi2cx);
  11.         printf("i2c scan example: aim to find the i2c device on the bus\r\n");

接下来是核心代码:
  1. /* Scans for I2C client devices on the bus - that have an address within the
  2. *specified range [addr_min, addr_max]
  3. */
  4. void main_i2c_scan(uint8_t addr_min, uint8_t addr_max)
  5. {
  6.     uint8_t client_address;
  7.     uint8_t client_addr_str[5]={0};
  8.     static uint8_t IIC_Client_Num = 0;
  9.     printf("\r\n I2C Scan started from 0x%02X to 0x%02X:", addr_min, addr_max);
  10.     //LCD_ShowString(0,35,"I2C Client:",RED,WHITE,12,0);
  11.     for (client_address = addr_min; client_address <= addr_max; client_address++)
  12.     {
  13.         printf("\r\n Scanning client address = 0x%02X", (int)client_address);       

  14.                             /* start the request reception process */

  15.                                 //I2C_Send7bitAddress(I2C1, client_address, I2C_Direction_Transmitter);
  16.                                 if((i2c_status = i2c_master_transmit(&hi2cx, client_address, &client_address, 1, I2C_TIMEOUT)) == I2C_OK )
  17.                                 {
  18.             printf("\r\n---- --> client (0x%02X) ACKED <-- ------ ", (int)client_address);
  19.             client_addr_str[0] = '0';
  20.             client_addr_str[1] = 'x';
  21.             if(client_address/16 >= 10)
  22.                 client_addr_str[2] = client_address/16 -10 + 'A';
  23.             else
  24.                 client_addr_str[2] = client_address/16 + '0';
  25.             if(client_address%16 >= 10)
  26.                 client_addr_str[3] = client_address%16 -10 + 'A';
  27.             else
  28.                 client_addr_str[3] = client_address%16 + '0';
  29.             client_addr_str[4] = '\0';
  30.             IIC_Client_Num++;
  31.                        
  32.                                                 printf("Yes, I2C Device found. Device Addr: %s",client_addr_str);
  33.                                 }else{
  34.                                         continue;
  35.                                 }
  36.         
  37.         delay_ms(50);
  38.     }//<--for--loop>
  39.     printf("\r\n ----------------- I2C Scan ended -----------------");
  40. }

串口输出:
  1. i2c scan example: aim to find the i2c device on the bus

  2. I2C Scan started from 0x00 to 0x7F:
  3. Scanning client address = 0x00
  4. Scanning client address = 0x01
  5. Scanning client address = 0x02
  6. Scanning client address = 0x03
  7. Scanning client address = 0x04
  8. Scanning client address = 0x05
  9. Scanning client address = 0x06
  10. Scanning client address = 0x07
  11. Scanning client address = 0x08
  12. Scanning client address = 0x09
  13. Scanning client address = 0x0A
  14. Scanning client address = 0x0B
  15. Scanning client address = 0x0C
  16. Scanning client address = 0x0D
  17. Scanning client address = 0x0E
  18. Scanning client address = 0x0F
  19. Scanning client address = 0x10
  20. Scanning client address = 0x11
  21. Scanning client address = 0x12
  22. Scanning client address = 0x13
  23. Scanning client address = 0x14
  24. Scanning client address = 0x15
  25. Scanning client address = 0x16
  26. Scanning client address = 0x17
  27. Scanning client address = 0x18
  28. Scanning client address = 0x19
  29. Scanning client address = 0x1A
  30. Scanning client address = 0x1B
  31. Scanning client address = 0x1C
  32. Scanning client address = 0x1D
  33. Scanning client address = 0x1E
  34. Scanning client address = 0x1F
  35. Scanning client address = 0x20
  36. Scanning client address = 0x21
  37. Scanning client address = 0x22
  38. Scanning client address = 0x23
  39. Scanning client address = 0x24
  40. Scanning client address = 0x25
  41. Scanning client address = 0x26
  42. Scanning client address = 0x27
  43. Scanning client address = 0x28
  44. Scanning client address = 0x29
  45. Scanning client address = 0x2A
  46. Scanning client address = 0x2B
  47. Scanning client address = 0x2C
  48. Scanning client address = 0x2D
  49. Scanning client address = 0x2E
  50. Scanning client address = 0x2F
  51. Scanning client address = 0x30
  52. Scanning client address = 0x31
  53. Scanning client address = 0x32
  54. Scanning client address = 0x33
  55. Scanning client address = 0x34
  56. Scanning client address = 0x35
  57. Scanning client address = 0x36
  58. Scanning client address = 0x37
  59. Scanning client address = 0x38
  60. Scanning client address = 0x39
  61. Scanning client address = 0x3A
  62. Scanning client address = 0x3B
  63. Scanning client address = 0x3C
  64. Scanning client address = 0x3D
  65. Scanning client address = 0x3E
  66. Scanning client address = 0x3F
  67. Scanning client address = 0x40
  68. Scanning client address = 0x41
  69. Scanning client address = 0x42
  70. Scanning client address = 0x43
  71. Scanning client address = 0x44
  72. Scanning client address = 0x45
  73. Scanning client address = 0x46
  74. Scanning client address = 0x47
  75. Scanning client address = 0x48
  76. Scanning client address = 0x49
  77. Scanning client address = 0x4A
  78. Scanning client address = 0x4B
  79. Scanning client address = 0x4C
  80. Scanning client address = 0x4D
  81. Scanning client address = 0x4E
  82. Scanning client address = 0x4F
  83. Scanning client address = 0x50
  84. Scanning client address = 0x51
  85. Scanning client address = 0x52
  86. Scanning client address = 0x53
  87. Scanning client address = 0x54
  88. Scanning client address = 0x55
  89. Scanning client address = 0x56
  90. Scanning client address = 0x57
  91. Scanning client address = 0x58
  92. Scanning client address = 0x59
  93. Scanning client address = 0x5A
  94. Scanning client address = 0x5B
  95. Scanning client address = 0x5C
  96. Scanning client address = 0x5D
  97. Scanning client address = 0x5E
  98. Scanning client address = 0x5F
  99. Scanning client address = 0x60
  100. Scanning client address = 0x61
  101. Scanning client address = 0x62
  102. Scanning client address = 0x63
  103. Scanning client address = 0x64
  104. Scanning client address = 0x65
  105. Scanning client address = 0x66
  106. Scanning client address = 0x67
  107. Scanning client address = 0x68
  108. Scanning client address = 0x69
  109. Scanning client address = 0x6A
  110. Scanning client address = 0x6B
  111. Scanning client address = 0x6C
  112. Scanning client address = 0x6D
  113. Scanning client address = 0x6E
  114. Scanning client address = 0x6F
  115. Scanning client address = 0x70
  116. Scanning client address = 0x71
  117. Scanning client address = 0x72
  118. Scanning client address = 0x73
  119. Scanning client address = 0x74
  120. Scanning client address = 0x75
  121. Scanning client address = 0x76
  122. Scanning client address = 0x77
  123. Scanning client address = 0x78
  124. ---- --> client (0x78) ACKED <-- ------ Yes, I2C Device found. Device Addr: 0x78
  125. Scanning client address = 0x79
  126. ---- --> client (0x79) ACKED <-- ------ Yes, I2C Device found. Device Addr: 0x79
  127. Scanning client address = 0x7A
  128. Scanning client address = 0x7B
  129. Scanning client address = 0x7C
  130. Scanning client address = 0x7D
  131. Scanning client address = 0x7E
  132. Scanning client address = 0x7F
  133. ----------------- I2C Scan ended -----------------

结果分析:
0x78与0x79实际上指向的是同一个设备(7 bit Address =0x3C 或者 0b'011-1100),因为每个I2C设备都有两个地址,一个用于写入,一个用于读取。


gangong 发表于 2024-10-31 07:01 | 显示全部楼层
写的很美
可怜的小弗朗士 发表于 2024-11-9 18:54 | 显示全部楼层
这个扫描的原理是啥
 楼主| YangTwo 发表于 2024-11-9 19:02 | 显示全部楼层

依次发送不同的地址到总线上,看有没有收到ACK。收到ACK,就表示这个地址是某个器件的地址,因为它回复了ACK。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

110

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

27

主题

110

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部