es8218e.lua 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. -- es8218e器件地址
  2. local es8218e_address = 0x10
  3. -- es8218e初始化寄存器配置
  4. local es8218e_reg = {
  5. {0x00, 0x00},
  6. {0x01, 0x2F + (0 << 7)},
  7. {0x02, 0x01},
  8. {0x03, 0x20},
  9. {0x04, 0x01},
  10. {0x05, 0x00},
  11. {0x06, 4 + (0 << 5)},
  12. {0x10, 0x18 + 0},
  13. {0x07, 0 + (3 << 2)},
  14. {0x09, 0x00},
  15. {0x0A, 0x22 + (0xCC * 0)},
  16. {0x0B, 0x02 - 0},
  17. {0x14, 0xA0},
  18. {0x0D, 0x30},
  19. {0x0E, 0x20},
  20. {0x23, 0x00},
  21. {0x24, 0x00},
  22. {0x18, 0x04},
  23. {0x19, 0x04},
  24. {0x0F, (0 << 5) + (1 << 4) + 7},
  25. {0x08, 0x00},
  26. {0x00, 0x80},
  27. {0x12, 0x1C},
  28. {0x11, 0},
  29. {0x01, (0x2f) + (1 << 7)},
  30. }
  31. -- i2s数据接收buffer
  32. local rx_buff = zbuff.create(3200)
  33. -- amr数据存放buffer,尽可能地给大一些
  34. local amr_buff = zbuff.create(10240)
  35. --创建一个amr的encoder
  36. local encoder = codec.create(codec.AMR, false)
  37. -- i2s数据接收回调
  38. local function record_cb(id, buff)
  39. if buff then
  40. log.info("I2S", id, "接收了", rx_buff:used())
  41. codec.encode(encoder, rx_buff, amr_buff) -- 对录音数据进行amr编码,成功的话这个接口会返回true
  42. end
  43. end
  44. local function record_task()
  45. sys.wait(5000)
  46. uart.setup(1, 115200) -- 开启串口1
  47. log.info("i2c initial",i2c.setup(0, i2c.FAST)) -- 开启i2c
  48. i2s.setup(0, 0, 8000, 16, 1, i2s.MODE_I2S) -- 开启i2s
  49. i2s.on(0, record_cb) -- 注册i2s接收回调
  50. i2s.recv(0, rx_buff, 3200)
  51. sys.wait(300)
  52. for i, v in pairs(es8218e_reg) do -- 初始化es8218e
  53. i2c.send(0,es8218e_address,v,1)
  54. end
  55. sys.wait(5000)
  56. i2c.send(0, es8218e_address,{0x01, (0x2f) + (1 << 7)},1) -- 停止录音
  57. i2s.stop(0) -- 停止接收
  58. log.info("录音5秒结束")
  59. uart.write(1, "#!AMR\n") -- 向串口发送amr文件标识数据
  60. sys.wait(5) -- 等待5ms确保发送成功
  61. uart.write(1, amr_buff:query()) -- 向串口发送编码后的amr数据
  62. end
  63. pm.power(pm.DAC_EN, true) -- 打开es8218e芯片供电
  64. sys.taskInit(record_task)