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

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

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

 
2-然后我们需要查看CMT2300A的资料手册,这里的话我们可以去芯片官网,也可以去模组官网,一般来说两边都可以拿到一些资源
     
这两个地方都可以拿到非常多的资料,当然想要了解这个芯片当然要把下面所有的资料都看完的。

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

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

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

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

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

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


 

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

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

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

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

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

FCSB -> PB6

FCSB -> PB5

SDIO -> PB4

CLK -> PB3


 

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

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

添加到keil中

然后需要适配一好printf函数,适配好delay_ms
 
接下来修改驱动div_cmt2300a.c


 

复制
#define SDA0_IN()  {GPIOB->cfgr &= ~(3<<(4*2));GPIOB->cfgr |= (0<<(4*2));}

#define SDA0_OUT() {GPIOB->cfgr &= ~(3<<(4*2));GPIOB->cfgr |= (1<<(4*2));}

#define READ_SDA0  gpio_input_data_bit_read(GPIOB, GPIO_PINS_4)



#define IIC0_SDA_1  gpio_bits_set(GPIOB, GPIO_PINS_4)

#define IIC0_SDA_0  gpio_bits_reset(GPIOB, GPIO_PINS_4)







void cmt_spi3_delay(void)

{

    int n = 20;

    while(n--);

        //delay_us(1);

}



void cmt_spi3_delay_us(void)

{

    int n = 20;

    while(n--);

        //delay_us(1);

}



void cmt_spi3_csb_out(void)

{



         /* gpio output config */

//        gpio_init_type gpio_init_struct;

//  gpio_default_para_init(&gpio_init_struct);



//  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;

//  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;

//  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;

//  gpio_init_struct.gpio_pins = GPIO_PINS_5;

//  gpio_init_struct.gpio_pull = GPIO_PULL_UP;

//  gpio_init(GPIOB, &gpio_init_struct);

}



void cmt_spi3_fcsb_out(void)

{



//        gpio_init_type gpio_init_struct;

//  gpio_default_para_init(&gpio_init_struct);



//  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;

//  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;

//  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;

//  gpio_init_struct.gpio_pins = GPIO_PINS_6;

//  gpio_init_struct.gpio_pull = GPIO_PULL_UP;

//  gpio_init(GPIOB, &gpio_init_struct);

}



void cmt_spi3_sclk_out(void)

{



//        gpio_init_type gpio_init_struct;

//  gpio_default_para_init(&gpio_init_struct);



//  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;

//  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;

//  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;

//  gpio_init_struct.gpio_pins = GPIO_PINS_3;

//  gpio_init_struct.gpio_pull = GPIO_PULL_UP;

//  gpio_init(GPIOB, &gpio_init_struct);

}



void cmt_spi3_sdio_out(void)

{



        SDA0_OUT();

}



void cmt_spi3_sdio_in(void)

{

        SDA0_IN();



}



void cmt_spi3_csb_1(void)

{



        gpio_bits_set(GPIOB,GPIO_PINS_5);

}



void cmt_spi3_csb_0(void)

{



        gpio_bits_reset(GPIOB,GPIO_PINS_5);

}



void cmt_spi3_fcsb_1(void)       

{

   gpio_bits_set(GPIOB,GPIO_PINS_6);

}



void cmt_spi3_fcsb_0(void)

{

   gpio_bits_reset(GPIOB,GPIO_PINS_6);

}



void cmt_spi3_sclk_1(void)

{

        gpio_bits_set(GPIOB,GPIO_PINS_3);

}



void cmt_spi3_sclk_0(void)

{

        gpio_bits_reset(GPIOB,GPIO_PINS_3);

}



void cmt_spi3_sdio_1(void)

{

        IIC0_SDA_1;



}



void cmt_spi3_sdio_0(void)

{

        IIC0_SDA_0;



}



uint8_t cmt_spi3_sdio_read(void)

{

        

        uint8_t re =READ_SDA0;



  return re;

}
到这基本驱动已经移植完成了。
这个驱动其实模组厂商也是参考官方的,遗留的冗余代码一句都没少,比如
 

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

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

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

 

653376549dc3c5887c.png (91.19 KB )

653376549dc3c5887c.png

660086549e07e55141.png (84.09 KB )

660086549e07e55141.png

597236549e51014063.png (10.84 KB )

597236549e51014063.png

---------------------
作者:HES21
链接:https://bbs.21ic.com/icview-3338878-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

STM32 CMT2300A是一款低功耗、高集成度的蓝牙模块,用于实现物联网设备间的短距离无线通信。在使用STM32进行CMT2300A收发程序开发时,通常会涉及到以下几个步骤: 1. **初始化硬件**: - 首先,需要配置STM32的GPIO引脚作为CMT2300A的RX和TX接口,并设置相应的中断服务函数。 - 使用STM32提供的蓝牙驱动库,比如BlueNRG SDK或STM32Cube库中的蓝牙APIs。 3. **建立收发任务**: - 开启接收数据的循环,在RX中断服务函数中处理接收到的数据,并可能存储在缓冲区中。 - 对于发送,编写一个函数来包装待发送的数据,然后调用驱动的发送功能。 4. **错误处理**: - 实现错误检测机制,比如检查接收状态指示、发送错误等,并在发生错误时采取适当的措施。 5. **连接管理**: - 如果是用于连接管理,需要实现连接请求、断开连接、重连等操作,可能涉及蓝牙配对过程。 6. **数据传输**: - 利用CMT2300A提供的API发送和接收数据,确保数据包的正确封装和解封装。 以下是一个简化版的示例代码片段(仅作参考,实际开发时需要考虑更多的细节): ```c // 引入必要的头文件 #include "blueNRG.h" // 初始化蓝牙模块 void init_bluetooth(void) { // 配置GPIO // ... // 初始化驱动 bluenrg_init(); } // 接收数据 void ble_receive(void) { uint8_t received_data; while (bluenrg_is_data_available()) { received_data = bluenrg_read_data(); // 处理接收到的数据 // ... } } // 发送数据 void ble_send(uint8_t* data, uint16_t length) { bluenrg_write_data(data, length); } // 主循环 int main(void) { init_bluetooth(); // 进入接收和发送数据的无限循环 while (1) { ble_receive(); // 发送数据如果有必要 ble_send(some_data_to_send, sizeof(some_data_to_send)); } return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值