本帖最后由 muyichuan2012 于 2023-11-7 19:31 编辑
本文主要内容就是使用AT-START-F423开发板连接CMT2300A,进行单向通讯
本文适合任何小白朋友
1-我们先准备硬件,AT-START-F423开发板连接CMT2300A
(这里没有打广告,这个模组确实在飞线调试方面比较容易)
2-然后我们需要查看CMT2300A的资料手册,这里的话我们可以去芯片官网,也可以去模组官网,一般来说两边都可以拿到一些资源
这两个地方都可以拿到非常多的资料,当然想要了解这个芯片当然要把下面所有的资料都看完的。
官方资料这里说的很清楚,类似SPI的接口,但是数据口是双向的,
基本上我们只需要操作芯片的4个口就行了,但是不是标准spi,意味着我们不能用开发板的硬件spi了,
需要我们自己用IO口模拟协议,这多费劲啊,来看看资料里面有没有例子。
模组厂商非常人性化有4个例子(官网也有,没有这个好),我们用STM32的来参考
有基础的同学稍微看一下例子程序应该就知道,程序主要的只需要用到uart,和模拟spi驱动,以及cmt2300a的应用
需要我们修改的只有这个驱动文件,我们只需要在开发板上实现uart,实现div_cmt2300a.c驱动就可以了,
实际只需要我们适配设置io高低电平,设置io方向,
IO分配:
使用bench软件生成我们的基础程序。只需要配置uart1和4个io口
生成后就可以打开工程了,继续把例子里面的文件拷贝过来
然后需要适配一好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初始化了,不知道官方是什么意思。
程序只能选择发送或者接收,需要用两套硬件来进行测试,我这边手上用了一个stm32来进行交叉测试。
|