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 )
660086549e07e55141.png (84.09 KB )
597236549e51014063.png (10.84 KB )
---------------------
作者:HES21
链接:https://bbs.21ic.com/icview-3338878-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。