MCP4725.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. --- 模块功能:I2C MCP4725功能测试.
  2. -- @author denghai
  3. -- @module i2c.MCP4725
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2021.09.16
  7. module(...,package.seeall)
  8. require "bit"
  9. require"utils"
  10. local i2cid = 2
  11. --定义器件在IIC总线中的从地址
  12. --//This is the I2C Address of the MCP4725, by default (A0 pulled to GND).
  13. local MCP4725_ADDR = 0x60
  14. --mcp4725 mode
  15. local MCP4725_MODE_DAC = 0x00 --/**< DAC mode */
  16. local MCP4725_MODE_EEPROM = 0x03 --/**< EEPROM mode */
  17. --mcp4725 power down enumeration
  18. local MCP4725_POWER_DOWN_MODE_NORMAL = 0x00 --/**< power down normal mode */
  19. local MCP4725_POWER_DOWN_MODE_1K_GND = 0x01 --/**< power down 1K GND */
  20. local MCP4725_POWER_DOWN_MODE_100K_GND = 0x02 --/**< power down 100K GND */
  21. local MCP4725_POWER_DOWN_MODE_500K_GND = 0x03 --/**< power down 500K GND */
  22. --/Sinewave Tables were generated using this calculator:
  23. --//http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml
  24. local sintab2 =
  25. {
  26. 2048, 2073, 2098, 2123, 2148, 2174, 2199, 2224,
  27. 2249, 2274, 2299, 2324, 2349, 2373, 2398, 2423,
  28. 2448, 2472, 2497, 2521, 2546, 2570, 2594, 2618,
  29. 2643, 2667, 2690, 2714, 2738, 2762, 2785, 2808,
  30. 2832, 2855, 2878, 2901, 2924, 2946, 2969, 2991,
  31. 3013, 3036, 3057, 3079, 3101, 3122, 3144, 3165,
  32. 3186, 3207, 3227, 3248, 3268, 3288, 3308, 3328,
  33. 3347, 3367, 3386, 3405, 3423, 3442, 3460, 3478,
  34. 3496, 3514, 3531, 3548, 3565, 3582, 3599, 3615,
  35. 3631, 3647, 3663, 3678, 3693, 3708, 3722, 3737,
  36. 3751, 3765, 3778, 3792, 3805, 3817, 3830, 3842,
  37. 3854, 3866, 3877, 3888, 3899, 3910, 3920, 3930,
  38. 3940, 3950, 3959, 3968, 3976, 3985, 3993, 4000,
  39. 4008, 4015, 4022, 4028, 4035, 4041, 4046, 4052,
  40. 4057, 4061, 4066, 4070, 4074, 4077, 4081, 4084,
  41. 4086, 4088, 4090, 4092, 4094, 4095, 4095, 4095,
  42. 4095, 4095, 4095, 4095, 4094, 4092, 4090, 4088,
  43. 4086, 4084, 4081, 4077, 4074, 4070, 4066, 4061,
  44. 4057, 4052, 4046, 4041, 4035, 4028, 4022, 4015,
  45. 4008, 4000, 3993, 3985, 3976, 3968, 3959, 3950,
  46. 3940, 3930, 3920, 3910, 3899, 3888, 3877, 3866,
  47. 3854, 3842, 3830, 3817, 3805, 3792, 3778, 3765,
  48. 3751, 3737, 3722, 3708, 3693, 3678, 3663, 3647,
  49. 3631, 3615, 3599, 3582, 3565, 3548, 3531, 3514,
  50. 3496, 3478, 3460, 3442, 3423, 3405, 3386, 3367,
  51. 3347, 3328, 3308, 3288, 3268, 3248, 3227, 3207,
  52. 3186, 3165, 3144, 3122, 3101, 3079, 3057, 3036,
  53. 3013, 2991, 2969, 2946, 2924, 2901, 2878, 2855,
  54. 2832, 2808, 2785, 2762, 2738, 2714, 2690, 2667,
  55. 2643, 2618, 2594, 2570, 2546, 2521, 2497, 2472,
  56. 2448, 2423, 2398, 2373, 2349, 2324, 2299, 2274,
  57. 2249, 2224, 2199, 2174, 2148, 2123, 2098, 2073,
  58. 2048, 2023, 1998, 1973, 1948, 1922, 1897, 1872,
  59. 1847, 1822, 1797, 1772, 1747, 1723, 1698, 1673,
  60. 1648, 1624, 1599, 1575, 1550, 1526, 1502, 1478,
  61. 1453, 1429, 1406, 1382, 1358, 1334, 1311, 1288,
  62. 1264, 1241, 1218, 1195, 1172, 1150, 1127, 1105,
  63. 1083, 1060, 1039, 1017, 995, 974, 952, 931,
  64. 910, 889, 869, 848, 828, 808, 788, 768,
  65. 749, 729, 710, 691, 673, 654, 636, 618,
  66. 600, 582, 565, 548, 531, 514, 497, 481,
  67. 465, 449, 433, 418, 403, 388, 374, 359,
  68. 345, 331, 318, 304, 291, 279, 266, 254,
  69. 242, 230, 219, 208, 197, 186, 176, 166,
  70. 156, 146, 137, 128, 120, 111, 103, 96,
  71. 88, 81, 74, 68, 61, 55, 50, 44,
  72. 39, 35, 30, 26, 22, 19, 15, 12,
  73. 10, 8, 6, 4, 2, 1, 1, 0,
  74. 0, 0, 1, 1, 2, 4, 6, 8,
  75. 10, 12, 15, 19, 22, 26, 30, 35,
  76. 39, 44, 50, 55, 61, 68, 74, 81,
  77. 88, 96, 103, 111, 120, 128, 137, 146,
  78. 156, 166, 176, 186, 197, 208, 219, 230,
  79. 242, 254, 266, 279, 291, 304, 318, 331,
  80. 345, 359, 374, 388, 403, 418, 433, 449,
  81. 465, 481, 497, 514, 531, 548, 565, 582,
  82. 600, 618, 636, 654, 673, 691, 710, 729,
  83. 749, 768, 788, 808, 828, 848, 869, 889,
  84. 910, 931, 952, 974, 995, 1017, 1039, 1060,
  85. 1083, 1105, 1127, 1150, 1172, 1195, 1218, 1241,
  86. 1264, 1288, 1311, 1334, 1358, 1382, 1406, 1429,
  87. 1453, 1478, 1502, 1526, 1550, 1575, 1599, 1624,
  88. 1648, 1673, 1698, 1723, 1747, 1772, 1797, 1822,
  89. 1847, 1872, 1897, 1922, 1948, 1973, 1998, 2023
  90. }
  91. local gs_handle={inited=0,mode=0,power_mode=0,ref_voltage=0}
  92. function mcp4725_init(handle)
  93. if (nil==handle)then -- /* check handle */
  94. return 2 -- /* return error */
  95. end
  96. if i2c.setup(i2cid,i2c.SLOW) ~= i2c.SLOW then
  97. log.error("MCP4725","i2c.setup fail")
  98. i2c.close(i2cid)
  99. return 1
  100. end
  101. handle.inited = 1 -- /* flag finish initialization */
  102. return 0 -- /* success return 0 */
  103. end
  104. function mcp4725_deinit(handle)
  105. if (nil==handle) then -- /* check handle */
  106. return 2 -- /* return error */
  107. end
  108. if (1~=handle.inited)then --/* check handle initialization */
  109. return 3 -- /* return error */
  110. end
  111. i2c.close(i2cid)
  112. handle.inited = 0 -- /* flag close */
  113. return 0 -- /* success return 0 */
  114. end
  115. function mcp4725_set_mode(handle, mode)
  116. if (nil==handle)then
  117. return 2
  118. end
  119. if (1~=handle.inited)then
  120. return 3
  121. end
  122. handle.mode = mode
  123. return 0 --/* success return 0 */
  124. end
  125. function mcp4725_get_mode()
  126. if (nil==handle)then
  127. return 2
  128. end
  129. if (1~=handle.inited)then
  130. return 3
  131. end
  132. return handle.mode
  133. end
  134. function mcp4725_set_power_mode(handle, mode)
  135. if (nil==handle)then
  136. return 2
  137. end
  138. if (1~=handle.inited)then
  139. return 3
  140. end
  141. handle.power_mode = mode
  142. return 0 -- /* success return 0 */
  143. end
  144. function mcp4725_get_power_mode()
  145. if (nil==handle)then
  146. return 2
  147. end
  148. if (1~=handle.inited)then
  149. return 3
  150. end
  151. return handle.power_mode
  152. end
  153. function mcp4725_set_reference_voltage(handle, ref_voltage)
  154. if (nil==handle)then
  155. return 2
  156. end
  157. if (1~=handle.inited)then
  158. return 3
  159. end
  160. handle.ref_voltage = ref_voltage
  161. return 0
  162. end
  163. function mcp4725_get_reference_voltage()
  164. if (nil==handle)then
  165. return 2
  166. end
  167. if (1~=handle.inited)then
  168. return 3
  169. end
  170. return handle.ref_voltage
  171. end
  172. function mcp4725_convert_to_register(handle, s)
  173. local reg = 0
  174. if (nil==handle) then -- /* check handle */
  175. return false
  176. end
  177. if (1~=handle.inited) then
  178. return false
  179. end
  180. if (0==handle.ref_voltage)then
  181. log.info("mcp4725: reference voltage can't be zero.\n")
  182. return 1 -- /* return error */
  183. end
  184. reg = (s * 4096.0000000 / handle.ref_voltage)
  185. return reg
  186. end
  187. function mcp4725_read(handle)
  188. buf={0,0,0,0,0}
  189. temp = "0"
  190. value = 0
  191. if ("nil"==type(handle)) then
  192. return false
  193. end
  194. if (1~=handle.inited )then
  195. return false
  196. end
  197. temp = i2c.recv(i2cid,MCP4725_ADDR,5)
  198. if(nil == temp) or (5 ~= #temp) then -- /* read data */
  199. log.info("mcp4725: read failed.\n") -- /* read data failed */
  200. return false -- /* return error */
  201. end
  202. _,buf[1],buf[2],buf[3],buf[4],buf[5] =pack.unpack(temp,"bbbbb")
  203. if (MCP4725_MODE_DAC==handle.mode) then -- /* if use dac mode */
  204. value = bit.bor(bit.lshift(buf[2],8),buf[3]) -- /* get value */
  205. value = bit.rshift(value,4) -- /* right shift 4 */
  206. return value
  207. else if (MCP4725_MODE_EEPROM==handle.mode) then -- /* if use eeprom mode */
  208. value = bit.bor(bit.lshift(bit.band(buf[4],0x0F),8) ,buf[5])
  209. return value
  210. else
  211. log.info("mcp4725: mode is invalid.\n") -- /* mode is invalid */
  212. return false
  213. end
  214. end
  215. end
  216. function mcp4725_write(handle, value)
  217. local buf={0,0,0,0,0,0}
  218. if ("nil"==type(handle)) then -- /* check handle */
  219. return 2 -- /* return error */
  220. end
  221. if 1~=handle.inited then --/* check handle initialization */
  222. return 3 -- /* return error */
  223. end
  224. value = bit.band(value,0xFFF) -- /* get valid part */
  225. if (MCP4725_MODE_DAC==handle.mode ) then -- /* dac mode */
  226. buf[1] = bit.band(bit.rshift(value,8) ,0xFF) -- /* set msb */
  227. buf[1] = bit.bor(buf[1] ,bit.lshift(handle.power_mode ,4)) -- /* set power mode */
  228. buf[2] = bit.band(value,0xFF) -- /* set lsb */
  229. buf[3] = bit.band(bit.rshift(value ,8) ,0xFF) -- /* set msb */
  230. buf[3] = bit.bor(buf[1],bit.lshift(handle.power_mode,4)) -- /* set power mode */
  231. buf[4] = bit.band(value,0xFF) -- /* set lsb */
  232. log.info("mcp4725_write", buf[1],buf[2],buf[3],buf[4])
  233. i2c.send(i2cid,MCP4725_ADDR, {buf[1],buf[2],buf[3],buf[4]}) -- /* write command */
  234. return 0
  235. else if (MCP4725_MODE_EEPROM==handle.mode) then -- /* eeprom mode */
  236. buf[1] = bit.lshift(0x03,5) -- /* set mode */
  237. buf[1] = bit.bor(buf[1] ,bit.lshift(handle.power_mode,1)) -- /* set power mode */
  238. value = bit.lshift(value, 4) -- /* right shift 4 */
  239. buf[2] = bit.band(bit.rshift(value ,8),0xFF) -- /* set msb */
  240. buf[3] = bit.band(value,0xFF) -- /* set lsb */
  241. buf[4] = bit.lshift(0x03 ,5) -- /* set mode */
  242. buf[4] = bit.bor(buf[1] ,bit.lshift(handle.power_mode ,1)) -- /* set power mode */
  243. value = bit.lshift(value,4) -- /* right shift 4 */
  244. buf[5] = bit.band(bit.rshift(value,8),0xFF) -- /* set msb */
  245. buf[6] = bit.band(value,0xFF) -- /* set lsb */
  246. i2c.send(i2cid,MCP4725_ADDR, {buf[1],buf[2],buf[3],buf[4],buf[5],buf[6]}) --/* write command */
  247. return 0
  248. else
  249. log.info("mcp4725: mode is invalid.\n") -- /* mode is invalid */
  250. return 1
  251. end
  252. end
  253. end
  254. function mcp4725_register_test()
  255. res = mcp4725_init(gs_handle)
  256. if (0~=res) then
  257. log.info("mcp4725: init failed.\n")
  258. return 1
  259. end
  260. res = mcp4725_set_reference_voltage(gs_handle, 3.3)
  261. if (0~=res) then
  262. log.info("mcp4725: set reference voltage failed.\n")
  263. mcp4725_deinit(gs_handle)
  264. return 1
  265. end
  266. end
  267. function mcp4725_write_test()
  268. local times = 512
  269. res = mcp4725_init(gs_handle)
  270. if (0~=res) then
  271. log.info("mcp4725: init failed.\n")
  272. return 1
  273. end
  274. --/* set power down normal mode */
  275. res = mcp4725_set_power_mode(gs_handle, MCP4725_POWER_DOWN_MODE_NORMAL)
  276. if (0~=res) then
  277. log.info("mcp4725: set power mode failed.\n")
  278. mcp4725_deinit(gs_handle)
  279. return 1
  280. end
  281. --/* set reference voltage 3.3V */
  282. res = mcp4725_set_reference_voltage(gs_handle, 3.3)
  283. if (0~=res) then
  284. log.info("mcp4725: set reference voltage failed.\n")
  285. mcp4725_deinit(gs_handle)
  286. return 1
  287. end
  288. --/* set dac mode */
  289. res = mcp4725_set_mode(gs_handle, MCP4725_MODE_DAC)
  290. if (0~=res) then
  291. log.info("mcp4725: set mode failed.\n")
  292. mcp4725_deinit(gs_handle)
  293. return 1
  294. end
  295. log.info("mcp4725: set dac mode.\n")
  296. for i=1, times, 1 do
  297. local input = (math.random(1,100)%65536)/65536.0*3.3
  298. --/* convert to register */
  299. res = mcp4725_convert_to_register(gs_handle, input)
  300. if (not(res)) then
  301. log.info("mcp4725: convert to register failed.\n")
  302. mcp4725_deinit(gs_handle)
  303. return 1
  304. end
  305. local reg = sintab2[i]
  306. -- local reg = res 用这个没有波形,直接输入数组值就有波形
  307. --/* write dac */
  308. log.info("mcp4725: write data sintab2[i]",i ,"=",sintab2[i])
  309. res = mcp4725_write(gs_handle, reg)
  310. if (0~=res) then
  311. log.info("mcp4725: write data failed.\n")
  312. mcp4725_deinit(gs_handle)
  313. return 1
  314. end
  315. -- 如下是读值测试
  316. -- sys.wait(1000)
  317. -- res = mcp4725_read(gs_handle)
  318. -- if not(res) then
  319. -- log.info("mcp4725: read data failed.\n")
  320. -- mcp4725_deinit(gs_handle)
  321. -- return 1
  322. -- end
  323. -- log.info("mcp4725: dac read check write", input,reg,res)
  324. -- sys.wait(1000)
  325. end
  326. end
  327. sys.taskInit(function()
  328. sys.wait(5000)
  329. local lookup = 1
  330. log.info("MCP4725")
  331. while true do
  332. mcp4725_write_test()
  333. sys.wait(5)
  334. end
  335. end)