i2c_utils.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "i2c_utils.h"
  2. #ifdef I2C_TOOLS_USE_SW_I2C
  3. #include "SoftwareI2C.h"
  4. SoftwareI2C softwarei2c;
  5. #else
  6. struct rt_i2c_bus_device *i2c_bus;
  7. #endif
  8. long strtonum(const char* str)
  9. {
  10. long data;
  11. if (strcmp(str, "0x"))
  12. {
  13. data = (rt_uint8_t)strtol(str, NULL, 0);
  14. }
  15. else
  16. {
  17. data = atoi(str);
  18. }
  19. return data;
  20. }
  21. void i2c_help()
  22. {
  23. rt_kprintf("---------------\n");
  24. rt_kprintf("i2c tools help:\n");
  25. rt_kprintf("---------------\n");
  26. #ifdef I2C_TOOLS_USE_SW_I2C
  27. rt_kprintf("i2c scan pin_sda pin_scl\n");
  28. rt_kprintf("i2c read pin_sda pin_scl address register [len=1]\n");
  29. rt_kprintf("i2c write pin_sda pin_scl address [register] data_0 data_1 ...\n\n");
  30. #else
  31. rt_kprintf("i2c scan bus_name\n");
  32. rt_kprintf("i2c read bus_name address register [len=1]\n");
  33. rt_kprintf("i2c write bus_name address [register] data_0 data_1 ...\n\n");
  34. #endif
  35. }
  36. #ifdef I2C_TOOLS_USE_SW_I2C
  37. rt_bool_t i2c_init(int sda, int scl)
  38. {
  39. softwarei2c.begin(sda, scl);
  40. return RT_EOK;
  41. }
  42. #else
  43. rt_bool_t i2c_init(const char* busname)
  44. {
  45. i2c_bus = rt_i2c_bus_device_find(busname);
  46. if(i2c_bus == RT_NULL)
  47. {
  48. return RT_ERROR;
  49. }
  50. else
  51. {
  52. return RT_EOK;
  53. }
  54. }
  55. #endif
  56. int i2c_probe(char addr)
  57. {
  58. #ifdef I2C_TOOLS_USE_SW_I2C
  59. int ret = softwarei2c.beginTransmission(addr);
  60. softwarei2c.endTransmission();
  61. return ret;
  62. #else
  63. unsigned char cmd[1];
  64. cmd[0] = 0;
  65. struct rt_i2c_msg msgs;
  66. msgs.addr = addr;
  67. msgs.flags = RT_I2C_WR;
  68. msgs.buf = cmd;
  69. msgs.len = 0;
  70. return rt_i2c_transfer(i2c_bus, &msgs, 1);
  71. #endif
  72. }
  73. rt_bool_t i2c_write(char addr, rt_uint8_t* data, int len)
  74. {
  75. #ifdef I2C_TOOLS_USE_SW_I2C
  76. softwarei2c.beginTransmission(addr);
  77. int ret = softwarei2c.write(data, len);
  78. softwarei2c.endTransmission();
  79. return ret;
  80. #else
  81. struct rt_i2c_msg msgs;
  82. msgs.addr = addr;
  83. msgs.flags = RT_I2C_WR;
  84. msgs.buf = data;
  85. msgs.len = len;
  86. return (rt_i2c_transfer(i2c_bus, &msgs, 1) == 1);
  87. #endif
  88. }
  89. rt_uint8_t i2c_read(rt_uint8_t addr, rt_uint8_t reg, rt_uint8_t* buffer, rt_uint8_t len)
  90. {
  91. #ifdef I2C_TOOLS_USE_SW_I2C
  92. rt_uint8_t ret = 0;
  93. softwarei2c.requestFrom(addr, len);
  94. while (softwarei2c.available()) {
  95. buffer[ret] = softwarei2c.read();
  96. ret++;
  97. }
  98. return ret;
  99. #else
  100. struct rt_i2c_msg msgs[2];
  101. msgs[0].addr = addr;
  102. msgs[0].flags = RT_I2C_WR;
  103. msgs[0].buf = ®
  104. msgs[0].len = 1;
  105. msgs[1].addr = addr;
  106. msgs[1].flags = RT_I2C_RD;
  107. msgs[1].buf = buffer;
  108. msgs[1].len = len;
  109. if (rt_i2c_transfer(i2c_bus, msgs, 2) == 2)
  110. {
  111. return len;
  112. }
  113. else
  114. {
  115. return 0;
  116. }
  117. #endif
  118. }
  119. void i2c_scan()
  120. {
  121. rt_kprintf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\n");
  122. for(unsigned char i=0; i<8; i++)
  123. {
  124. rt_kprintf("%d0: ", i);
  125. for(unsigned char j=0; j<16; j++)
  126. {
  127. char addr = i*16+j;
  128. if( i2c_probe(addr) == 1)
  129. {
  130. rt_kprintf("%02X", addr);
  131. }
  132. else
  133. {
  134. rt_kprintf("--");
  135. }
  136. rt_kprintf(" ");
  137. }
  138. rt_kprintf("\n");
  139. }
  140. }