小萌新第一次写东西,意在记录自己走过的弯路,分享经验~欢迎大佬批评指正!
目前我的项目中用到TDC芯片,这里选择的是ACAM的TDC-GP22芯片,原因是功能基本满足要求且价格便宜。
最初看芯片手册感觉功能很多,读写操作通过SPI实现,也比较方便。于是图省事,直接在淘宝上买了一个GP22的模块,制作者主要是针对芯片内部集成的模拟输入电路、脉冲发生器、内部触发器功能制作的,理论上可以直接用芯片发出的脉冲激励发射换能器,然后直接接收回波,读出飞跃时间(TOF)。
然后,拿到模块之后,第一步要做的是按照手册中提示测试SPI通信是否实现。这里就出现了问题。
SPI通信问题
按照手册中所述,可以通过写寄存器1(3字节 or 4字节),读取寄存器5得到写入数据的高1字节。
这里我用的控制器是STM32F103,写了一个简单的test函数,放在while(1)中,通过jlink仿真器观察变量。其中的读、写寄存器函数都扒的官方程序。
uint16_t Test_spi(void* Bus_Type)
{
uint16_t rcv0=0;
gp22_wr_config_reg(Bus_Type, 0x81, 0x88888800);
delay_us(10);
rcv0=gp22_read_n_bytes_int(Bus_Type, 2, 0XB0, 0x05);
delay_ms(100);
return rcv0;
}
在while(1)之前的是必要的初始化,归纳为:
1、单片机系统初始化(包括时钟、GPIO及复用等)
2、芯片上电指令 Power_On_Reset
3、芯片初始化 Init
然后在循环中测试spi功能,按理说变量rcv0应该一直为写入寄存器1数据的高1字节,但是读出却一直为0x0000.
在反复实验下,发现用手指以某个方向轻轻用力捏SPI4个引脚时能通信成功,松开又恢复0x0000,推断是模块连接的问题。
解决
在网上查询时,发现有个帖子说了类似的问题(原帖),后来楼主重新打板,让芯片的第33个引脚(芯片肚子下的大焊盘)接地。然后我也重新做了一次,芯片下面多打了几个过孔。并且拆了购买的模块的芯片,发现底下好像还真没接地。
打板焊接之后,重新测试,可以稳定实现SPI通信了。
后续
至此,SPI通信基本解决,后面就开始研究TDC的测时功能了,之后再记录。