[AT32F423] 【AT-START-F423测评】CMT2300A收发通讯

[复制链接]
3034|0
 楼主| HES21 发表于 2023-11-7 16:49 | 显示全部楼层 |阅读模式
本帖最后由 muyichuan2012 于 2023-11-7 19:31 编辑

     本文主要内容就是使用AT-START-F423开发板连接CMT2300A,进行单向通讯
本文适合任何小白朋友


1-我们先准备硬件,AT-START-F423开发板连接CMT2300A

297446549ddca9fd82.png


(这里没有打广告,这个模组确实在飞线调试方面比较容易)

933026549ddf88ffaf.png

2-然后我们需要查看CMT2300A的资料手册,这里的话我们可以去芯片官网,也可以去模组官网,一般来说两边都可以拿到一些资源

芯片官网:https://www.hoperf.cn/


这两个地方都可以拿到非常多的资料,当然想要了解这个芯片当然要把下面所有的资料都看完的。


如果只是想拿程序来跑,不看问题也不大。

608816549e06863c41.png


980506549e082caf54.png

3-上一步我们拿到了非常多的资料,


当然在此之前我们得先了解一下芯片的通讯协议:

891676549e2e9aa24f.png

官方资料这里说的很清楚,类似SPI的接口,但是数据口是双向的,

基本上我们只需要操作芯片的4个口就行了,但是不是标准spi,意味着我们不能用开发板的硬件spi了,

需要我们自己用IO口模拟协议,这多费劲啊,来看看资料里面有没有例子。


模组厂商非常人性化有4个例子(官网也有,没有这个好),我们用STM32的来参考

357006549e13d1e1d7.png

有基础的同学稍微看一下例子程序应该就知道,程序主要的只需要用到uart,和模拟spi驱动,以及cmt2300a的应用

747696549e5626780f.png


510476549e964742c3.png

文件中的h和c文件全部添加到工程中。

需要我们修改的只有这个驱动文件,我们只需要在开发板上实现uart,实现div_cmt2300a.c驱动就可以了,

实际只需要我们适配设置io高低电平,设置io方向,

IO分配:


FCSB -> PB6

FCSB -> PB5

SDIO -> PB4

CLK -> PB3


使用bench软件生成我们的基础程序。只需要配置uart1和4个io口

858476549ed7bc149e.png

550876549ee30bd9e1.png

599206549ee6078fd7.png

生成后就可以打开工程了,继续把例子里面的文件拷贝过来

439906549f10d27408.png

添加到keil中

196026549f8238dba0.png

然后需要适配一好printf函数,适配好delay_ms

接下来修改驱动div_cmt2300a.c



779716549f106bc50c.png

  1. #define SDA0_IN()  {GPIOB->cfgr &= ~(3<<(4*2));GPIOB->cfgr |= (0<<(4*2));}
  2. #define SDA0_OUT() {GPIOB->cfgr &= ~(3<<(4*2));GPIOB->cfgr |= (1<<(4*2));}
  3. #define READ_SDA0  gpio_input_data_bit_read(GPIOB, GPIO_PINS_4)

  4. #define IIC0_SDA_1  gpio_bits_set(GPIOB, GPIO_PINS_4)
  5. #define IIC0_SDA_0  gpio_bits_reset(GPIOB, GPIO_PINS_4)



  6. void cmt_spi3_delay(void)
  7. {
  8.     int n = 20;
  9.     while(n--);
  10.         //delay_us(1);
  11. }

  12. void cmt_spi3_delay_us(void)
  13. {
  14.     int n = 20;
  15.     while(n--);
  16.         //delay_us(1);
  17. }

  18. void cmt_spi3_csb_out(void)
  19. {

  20.          /* gpio output config */
  21. //        gpio_init_type gpio_init_struct;
  22. //  gpio_default_para_init(&gpio_init_struct);

  23. //  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  24. //  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  25. //  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  26. //  gpio_init_struct.gpio_pins = GPIO_PINS_5;
  27. //  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  28. //  gpio_init(GPIOB, &gpio_init_struct);
  29. }

  30. void cmt_spi3_fcsb_out(void)
  31. {

  32. //        gpio_init_type gpio_init_struct;
  33. //  gpio_default_para_init(&gpio_init_struct);

  34. //  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  35. //  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  36. //  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  37. //  gpio_init_struct.gpio_pins = GPIO_PINS_6;
  38. //  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  39. //  gpio_init(GPIOB, &gpio_init_struct);
  40. }

  41. void cmt_spi3_sclk_out(void)
  42. {

  43. //        gpio_init_type gpio_init_struct;
  44. //  gpio_default_para_init(&gpio_init_struct);

  45. //  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  46. //  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  47. //  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  48. //  gpio_init_struct.gpio_pins = GPIO_PINS_3;
  49. //  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  50. //  gpio_init(GPIOB, &gpio_init_struct);
  51. }

  52. void cmt_spi3_sdio_out(void)
  53. {

  54.         SDA0_OUT();
  55. }

  56. void cmt_spi3_sdio_in(void)
  57. {
  58.         SDA0_IN();

  59. }

  60. void cmt_spi3_csb_1(void)
  61. {

  62.         gpio_bits_set(GPIOB,GPIO_PINS_5);
  63. }

  64. void cmt_spi3_csb_0(void)
  65. {

  66.         gpio_bits_reset(GPIOB,GPIO_PINS_5);
  67. }

  68. void cmt_spi3_fcsb_1(void)      
  69. {
  70.    gpio_bits_set(GPIOB,GPIO_PINS_6);
  71. }

  72. void cmt_spi3_fcsb_0(void)
  73. {
  74.    gpio_bits_reset(GPIOB,GPIO_PINS_6);
  75. }

  76. void cmt_spi3_sclk_1(void)
  77. {
  78.         gpio_bits_set(GPIOB,GPIO_PINS_3);
  79. }

  80. void cmt_spi3_sclk_0(void)
  81. {
  82.         gpio_bits_reset(GPIOB,GPIO_PINS_3);
  83. }

  84. void cmt_spi3_sdio_1(void)
  85. {
  86.         IIC0_SDA_1;

  87. }

  88. void cmt_spi3_sdio_0(void)
  89. {
  90.         IIC0_SDA_0;

  91. }

  92. uint8_t cmt_spi3_sdio_read(void)
  93. {
  94.         
  95.         uint8_t re =READ_SDA0;

  96.   return re;
  97. }
到这基本驱动已经移植完成了。

这个驱动其实模组厂商也是参考官方的,遗留的冗余代码一句都没少,比如

113506549e84a61977.png


这几句把io设置成输出,完全就是多余的,因为初始化的时候已经把io初始化了,不知道官方是什么意思。


main函数调用:

321196549f9474d950.png

初始化ok的话会有如下打印:

328626549f97165dd4.png


程序只能选择发送或者接收,需要用两套硬件来进行测试,我这边手上用了一个stm32来进行交叉测试。

源码:




653376549dc3c5887c.png
660086549e07e55141.png
597236549e51014063.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部