pca9555.lua 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. --[[
  2. @module pca9555
  3. @summary pca9555 IO扩展
  4. @version 1.0
  5. @date 2024/1/15
  6. @author 小牛
  7. @usage
  8. i2c.setup(0, i2c.FAST)
  9. pca9555.setup(0, 0x20, 0x0000)
  10. for i=0,7 do
  11. pca9555.pin(i,0)
  12. end
  13. ]]
  14. local pca9555 = {}
  15. local PCA9555_i2cid=0
  16. local PCA9555_addr=0x20
  17. local PCA9555_mode=0x0000 --IO全为输出
  18. local PCA9555_IOstart=0xffff
  19. -- pca9555 registers define
  20. local PCA9555_REG_IN0 = 0x00 --输入端口寄存器0 默认值由外部逻辑决定 只可读不可写
  21. local PCA9555_REG_IN1 = 0x01 --输入端口寄存器1 默认值由外部逻辑决定 只可读不可写
  22. local PCA9555_REG_OUT0 = 0x02 --输出端口寄存器0 默认值为1 可读可写
  23. local PCA9555_REG_OUT1 = 0x03 --输入端口寄存器1 默认值为1 可读可写
  24. local PCA9555_REG_POL0 = 0x04 --极性反转寄存器0 默认值为0 可读可写
  25. local PCA9555_REG_POL1 = 0x05 --极性反转寄存器1 默认值为0 可读可写
  26. local PCA9555_REG0_CFG0 = 0x06 --配置端口寄存器0 默认为1 可读可写
  27. local PCA9555_REG1_CFG1 = 0x07 --配置端口寄存器1 默认为1 可读可写
  28. --[[
  29. 配置寄存器说明 1为输入模式 0为输出模式
  30. Config registers
  31. ---------------------------------------------------------------------------------------
  32. Config prot 0 register
  33. Bit 7 6 5 4 3 2 1
  34. Symbol C0.7 C0.6 C0.5 C0.4 C0.3 C0.2 C0.0
  35. Default 1 1 1 1 1 1 1
  36. ---------------------------------------------------------------------------------------
  37. Config prot 1 register
  38. Bit 7 6 5 4 3 2 1
  39. Symbol C1.7 C1.6 C1.5 C1.4 C1.3 C1.2 C1.0
  40. Default 1 1 1 1 1 1 1
  41. ---------------------------------------------------------------------------------------
  42. ]]
  43. --[[
  44. pca9555初始化
  45. @api pca955.setup(i2cid, addr,mode)
  46. @number i2cid 所在的i2c总线
  47. @number addr pca9555设备的i2c地址
  48. @number mode 配置输入输出模式 --0xffff 高八位配置IO 17-10 低八位配置IO 7-0
  49. @return 初始化失败,返回nil
  50. @usage
  51. i2c.setup(0, i2c.FAST)
  52. pca9555.setup(0,0x20,0xffff)
  53. ]]
  54. function pca9555.setup(i2cid,addr,mode)
  55. PCA9555_i2cid=i2cid
  56. PCA9555_addr=addr
  57. PCA9555_mode=mode
  58. readEncoder()
  59. local tmp=i2c.readReg(PCA9555_i2cid, PCA9555_addr, 0x02, 2)
  60. if tmp==nil then
  61. log.info("PCA9555初始化失败")
  62. return nil
  63. end
  64. if PCA9555_mode~=nil then
  65. i2c.writeReg(PCA9555_i2cid,PCA9555_addr,0x06,pack.pack("<H",PCA9555_mode))
  66. i2c.writeReg(PCA9555_i2cid,PCA9555_addr,0x02,pack.pack("<H",PCA9555_IOstart))
  67. else
  68. local recvData=i2c.readReg(PCA9555_i2cid, PCA9555_addr,0x00,2)
  69. _,recvData=pack.unpack(recvData,"<H")
  70. log.info("pca9555默认为完全输入模式",recvData)
  71. end
  72. end
  73. --[[
  74. pca9555 pin控制
  75. @api pca9555.pin(pin,val)
  76. @number pin 引脚 0-7 10-17
  77. @number val 高/低电平 1/0
  78. @return number 如果val未填,则读取pin的输出电平
  79. @usage
  80. for i=0,7 do
  81. pca9555.pin(i,0)
  82. end
  83. ]]
  84. function pca9555.pin(pin,val)
  85. if pin==nil then
  86. log.info("请选择引脚")
  87. elseif pin then
  88. if val==nil then
  89. if pin>9 then
  90. pin=pin-2
  91. end
  92. local tmp=i2c.readReg(PCA9555_i2cid, PCA9555_addr,0x00,2)
  93. _,tmp=pack.unpack(tmp,"<H")
  94. val=(tmp&(1<<pin))>>pin
  95. return val
  96. elseif val==0 then
  97. if pin>9 then
  98. pin=pin-2
  99. end
  100. PCA9555_IOstart=PCA9555_IOstart&(~(1<<pin))
  101. i2c.writeReg(PCA9555_i2cid,PCA9555_addr,0x02,pack.pack("<H",PCA9555_IOstart))
  102. else
  103. if pin>9 then
  104. pin=pin-2
  105. end
  106. PCA9555_IOstart=PCA9555_IOstart|(1<<pin)
  107. i2c.writeReg(PCA9555_i2cid,PCA9555_addr,0x02,pack.pack("<H",PCA9555_IOstart))
  108. end
  109. end
  110. end
  111. return pca9555