分享

CMT2119/2119A 示例代码及说明...

 区区收藏 2020-10-05

CMT2119A是一款常用的全频段单发无线发射芯片,我们使用外部MCU来控制CMT2119A。

1.配置连接图

我们利用MCU的IO来分别控制CMT2119A的DATA和CLK管脚。

2.2线接口(TWI)

    2线接口(Two-Write Interface)包括时间接口CLK和双向数据接口DATA。一个完整的W/R过程有16个时钟周期。前8个周期,DATA是输入口;后8个周期,如果是写过程。DATA是输入口,如果是读过程,DATA是输出口。时序图如下(图来自官方数据手册,侵删)


注意:
    1. 时钟应该运行在 1MHz 以下,上升沿发送数据,下降沿采样。
    2. 8 个周期为读写控制和地址位 A[5:0]. 其中 W/R 1 的时候表示读,为 0 的时候表示写。
    3. 写操作中 D[7:0]为待写入的数据,读操作中 D[7:0]为从芯片读出的数据。
    4. DATA 同时被复用为数据发射的 DATA 脚。
    5. TWI_RST (发送 32 个连续 0 0x8D00,总共 48 个时钟的数据,如下图所示)可用于复位 TWI电路,以便在遇到未知错误的时候恢复串口功能。 其中下图的命令适用于上升沿启动发射(默认设置)
    6. SOFT_RST(发送 0xBD01, 总共 16 个时钟的数据, 如下图所示)可用于复位除了 TWI 电路以

外的芯片其他所有电路,整个复位时间约需 1 ms。

    7. 方便起见,本文用 TWI_RDREG 表示 TWI 读操作,用 TWI_WRREG 表示 TWI 写操作。
a) TWI_RDREG(XX, YY)为发送 8b’ 11xx xxxx 读出 yyyy yyyy,其中 xx xxxx 为待读地址,范围 0x00 到 0x3F; yyyy yyyy 为读出值,范围为 0x00 到 0xFF。
b) TWI_WRREG(XX, ZZ)为发送 16’ 10xx xxxx zzzz zzzz,其中例如 xx xxxx 为待写地址,范围 0x00 到 0x3F; zzzz zzzz 为待写值,范围为 0x00 到 0xFF。
c) 例如:
i. 从地址 0x01 读取数据表示为 TWI_RDREG(0x1, DAT), 其中 DAT 表示从地址 0x1读出的数据。
ii. 对地址 0x2 写入数据 0xAA 表示为 TWI_WRREG(0x2, 0xAA)。
iii. SOFT_RST 可表示为 TWI_WRREG(0x3D, 0x01)。
8. DATA 是一个双向数据口,在读操作的后 8 个周期会被切换为输出口。为了避免潜在的电平冲突,当 DATA 切换为输出口的时候,主控(Master)相应的驱动端口要及时切换为输入口。

3.配置流程


4.示例程序

  1. #define CMT2119A_WR_CMD (unsigned char )0x80
  2. #define CMT2119A_RD_CMD (unsigned char )0xC0
  3. void TWI_WrByte(unsigned char SendByte)
  4. {
  5. unsigned char i = 0;
  6. for (i = 0; i < 8; i++)
  7. {
  8. TWI_SCK_H();
  9. if (SendByte & 0x80) //MSB
  10. TWI_SDA_H();
  11. else
  12. TWI_SDA_L();
  13. SendByte <<= 1;
  14. delay10Us(1);
  15. TWI_SCK_L();
  16. delay10Us(1);
  17. }
  18. }
  19. unsigned char TWI_RdByte(void)
  20. {
  21. unsigned char i;
  22. unsigned char ReceiveByte = 0xff;
  23. for (i = 0; i < 8; i++)
  24. {
  25. TWI_SCK_H();
  26. ReceiveByte <<= 1;
  27. delay10Us(1);
  28. TWI_SCK_L();
  29. if (TWI_SDA_read())
  30. ReceiveByte |= 0x01;
  31. else
  32. ReceiveByte &= 0xFE;
  33. delay10Us(1);
  34. }
  35. return ReceiveByte;
  36. }
  37. unsigned char TWI_RDREG(unsigned char ReadAddress, unsigned char xdata * pData)
  38. {
  39. ReadAddress |= CMT211XA_RD_CMD;
  40. TWI_SDA_H();
  41. TWI_SDA_PUSH_PULL();
  42. TWI_SCK_H();
  43. TWI_SCK_PUSH_PULL();
  44. TWI_WrByte(ReadAddress);
  45. TWI_SDA_H();
  46. TWI_SDA_OPEN_DRAIN();
  47. *pData = TWI_RdByte();
  48. TWI_SDA_H();
  49. TWI_SDA_OPEN_DRAIN();
  50. TWI_SCK_H();
  51. TWI_SCK_OPEN_DRAIN();
  52. return 1;
  53. }
  54. unsigned char TWI_WRREG(unsigned char WriteAddress, unsigned char SendByte)
  55. {
  56. WriteAddress |= CMT211XA_WR_CMD;
  57. //TWI_SDA_PUSH_PULL();
  58. TWI_SDA_H();
  59. TWI_SDA_PUSH_PULL();
  60. TWI_SCK_H();
  61. TWI_SCK_PUSH_PULL();
  62. TWI_WrByte(WriteAddress);
  63. TWI_WrByte(SendByte);
  64. TWI_SDA_H();
  65. TWI_SDA_OPEN_DRAIN();
  66. TWI_SCK_H();
  67. TWI_SCK_OPEN_DRAIN();
  68. return 1;
  69. }
  70. void TWI_RST(void)
  71. {
  72. TWI_SDA_H();
  73. TWI_SDA_PUSH_PULL();
  74. TWI_SCK_H();
  75. TWI_SCK_PUSH_PULL();
  76. // DATA pin low for 32 clock cycles and clocking in 0x8D00
  77. TWI_WrByte(0x00);
  78. TWI_WrByte(0x00);
  79. TWI_WrByte(0x00);
  80. TWI_WrByte(0x00);
  81. TWI_WrByte(0x8D);
  82. TWI_WrByte(0x00);
  83. TWI_SCK_H();
  84. TWI_SCK_OPEN_DRAIN();
  85. TWI_SDA_H();
  86. TWI_SDA_OPEN_DRAIN();
  87. }
  88. void TWI_OFF(void)
  89. {
  90. TWI_SDA_H();
  91. TWI_SDA_PUSH_PULL();
  92. TWI_SCK_H();
  93. TWI_SCK_PUSH_PULL();
  94. TWI_WrByte(0x8D);
  95. TWI_WrByte(0x02);
  96. TWI_SCK_H();
  97. TWI_SCK_OPEN_DRAIN();
  98. TWI_SDA_H();
  99. TWI_SDA_OPEN_DRAIN();
  100. }
  101. void SOFT_RST(void)
  102. {
  103. TWI_SDA_L();
  104. TWI_SDA_PUSH_PULL();
  105. TWI_SCK_H();
  106. TWI_SCK_PUSH_PULL();
  107. TWI_WrByte(0xBD);
  108. TWI_WrByte(0x01);
  109. TWI_SCK_H();
  110. TWI_SCK_OPEN_DRAIN();
  111. TWI_SDA_H();
  112. TWI_SDA_OPEN_DRAIN();
  113. }
  114. void FREQUENCY_CONFIG(void)
  115. {
  116. unsigned char low_data,high_data;
  117. unsigned char regaddr;
  118. unsigned short regdat;
  119. unsigned char low_rd,high_rd;
  120. // step1
  121. TWI_RST();
  122. // step2
  123. SOFT_RST();
  124. delayMs(1);
  125. // step3
  126. TWI_WRREG(0x02, 0x78);
  127. // step4
  128. TWI_WRREG(0x2F, 0x80);
  129. TWI_WRREG(0x35, 0xCA);
  130. TWI_WRREG(0x36, 0xEB);
  131. TWI_WRREG(0x37, 0x37);
  132. TWI_WRREG(0x38, 0x82);
  133. TWI_WRREG(0x12, 0x10);
  134. TWI_WRREG(0x12, 0x00);
  135. TWI_WRREG(0x24, 0x07);
  136. TWI_WRREG(0x1D, 0x20);
  137. // step5
  138. regaddr=0x07; // set frequency reg addr
  139. regdat=0xB81F; // set frequency reg data
  140. TWI_WRREG(0x18, regaddr);
  141. low_data=regdat%0x100;
  142. high_data=regdat/0x100;
  143. TWI_WRREG(0x19,low_data);
  144. TWI_WRREG(0x1A,high_data);
  145. TWI_WRREG(0x25, 0x01);
  146. // read register
  147. TWI_RDREG(0x1B,&low_rd);
  148. TWI_RDREG(0x1C,&high_rd);
  149. //if want set more reg, repeat step5
  150. // step6
  151. TWI_WRREG(0x0D, 0x02);
  152. // send data here
  153. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多