STM32调试TIC12400笔记

devtools/2024/9/23 15:32:39/

工作中需要用到,但是有关这个芯片的参考资料好少,自己写一下调试过程,持续更新中,还没调完。

用的是正点原子的mini板,芯片是stm32f103RCT,需要知道spi的相关知识,先配置spi,用cubemx,用硬件spi,下面会细说为什么用硬件,不用模拟 

一、建立通讯

1.tic时序分析 

首先是调通spi通信,和芯片建立联系,这部分需要看手册

先看时序,可以看到起始为低电平(也就是CPOL=0),在第二个沿采样(红色部分),也就是偶数个边沿也是下降沿采样(CPHA=1),spi最重要的两个参数就确定好了

1.1配置cubemx 

接下来就可以配置cubemx了

 cubemx老生常谈的步骤SYS-->RCC-->时钟树-->connectivity

 RCC

时钟树 

 采用软件片选,需要自己添加一路引脚,任选,只要不和你用的其他引脚发生冲突就行,我选的PA2

增加一路串口,用来调试

1.2基础代码 

新建好工程以后,在spi.cl里添加sp读写单字节代码,注意位置,否则改cubemx配置会覆盖代码

/* USER CODE BEGIN 1 */
/*SPI1 读写一个字节数据*/
uint8_t spi1_read_write_byte(uint8_t txdata){uint8_t rec_data;HAL_SPI_TransmitReceive(&hspi1,&txdata,&rec_data,1,1000);return rec_data;
}/* USER CODE END 1 */

在uart.c里添加重定向函数,用来打印,同样注意位置,如果报错,还需添加头文件stdio.h

/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口DEBUG_USART */HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);	return (ch);
}
/* USER CODE END 1 */

2.读写函数 

接下来是读写格式,用来编写读写函数,发现tic12400这块芯片每次发送32bit,而硬件spi都是8bit或者16bit,我们这里依旧采用板子自带的硬件8位spi,每八位一发,连发四次,凑够32bit,因为自己写时序比较麻烦,所以不用模拟spi

2.1 读写格式分析

写数据到芯片:要写 读写位+寄存器地址+数据+校验位

MOSI:      1  +  reg_addr  +    data     +   PAR

                bit 31  bit[30-25]      bit[24-1]     bit 0

可以看到写也是有返回值的,会返回六位标志位和上一次写入寄存器的值,可以通过接收写函数的返回值,判断数据发送对了

 从芯片读数据:要写 读写位+寄存器地址+don't care+校验位

MOSI:      0  +  reg_addr  +  don't care   +   PAR

                bit 31  bit[30-25]      bit[24-1]          bit 0

读也要写寄存器地址,不关心的位可以任意写,我写的全是0

从上图可以看到是有校验的,需要自己添加奇偶校验位,读手册可知用的是奇校验,所以我自己写了添加校验位的函数

2.2 读写函数代码

可能会需要延时,不需要太精确,用的for循环的

void for_delay_us(uint32_t nus)
{uint32_t Delay = nus * 168/4;do{__NOP();}while (Delay --);
}
uint32_t odd_parity(uint32_t num){uint8_t i=0,count=0;uint32_t ret=num;for(i=0;i<32;i++){if(num & 0x1) count++;(num)>>=1;}if(count%2==0){ret |=0x1;}return ret;
}
uint32_t tic12400write(uint8_t addr,uint32_t data){uint32_t senddata=0x80000000;//写bit31=1uint32_t ret,temp;senddata|=(addr<<25);//加入六位地址senddata|=(data<<1);//24位数据senddata=odd_parity(senddata);//添加奇偶校验位SPI_CS(1);//片选SPI_CS(0);temp=spi1_read_write_byte(senddata>>24);//发送数据,MSB先行,同时会有数据回传,也接收数据ret=temp<<24;temp=spi1_read_write_byte(senddata>>16);ret|=temp<<16;temp=spi1_read_write_byte(senddata>>8);ret|=temp<<8;temp=spi1_read_write_byte(senddata);ret|=temp;SPI_CS(1);return ret;
}uint32_t tic12400read(uint8_t addr){uint32_t senddata=0;uint32_t ret,temp;senddata|=(addr<<25);//加入六位地址senddata=odd_parity(senddata);//添加奇偶校验位SPI_CS(1);
//	for_delay_us(2);SPI_CS(0);
//	for_delay_us(2);temp=spi1_read_write_byte(senddata>>24);//发送数据,MSB先行,同时会有数据回传,也接收数据ret=temp<<24;temp=spi1_read_write_byte(senddata>>16);ret|=temp<<16;temp=spi1_read_write_byte(senddata>>8);ret|=temp<<8;temp=spi1_read_write_byte(senddata);ret|=temp;ret=odd_parity(ret);//添加奇偶校验位SPI_CS(1);return ret;
}

读写函数都写好之后我们来检测一下是否能与tic12400通信成功

这里需要用到下面这个寄存器

读到的结果会是bit5=1,也就是0x20

还有一点,tic12400所有的寄存器给的都是数据位,也就是相当于读写函数里的bit[1-24]

我们前面写的读函数接收到的是32位数据,所以这里要对数据进行处理,添加数据处理函数

uint32_t get_data(uint32_t data){data>>=1;data&=0xffffff;return data;
}

这样读出来结果是0x20,如果不做数据处理,读到的结果会是0x40,也是对的,要分清自己的代码读出的结果

 接下来就可以测试通信了,在mian里加入下面的代码,

 打开串口调试助手,可以接收到数据,通信成功,说明读写代码是没有问题的

 至此通信配置完成,确定可以和tic12400正常通信

接下来就是正是配置这个芯片了

二、配置芯片 

1.寄存器

因为我要检测开关通断,不需要知道具体的数值,所以比较模式就够用了,所以只说比较模式

首先来看寄存器,圈出来的五个是和比较模式有关的寄存器

 1.1DEVICE_ID  0x1

这个芯片可以用来检测通信是否成功,直接调用tic12400read读出的结果是0x40

1.2 INT_STAT  0x2

这个芯片主要用来清空标志位,如果读到的数据有错误(读写格式前六位的标志位),需要手动读取这个寄存器,清空标志位,否则无法通信 

跟比较模式配置有关的寄存器按照配置顺序介绍 

1.3 CONFIG  0x1A

这个寄存器相当于一个开关,bit11写1芯片开始工作,有两位比较重要

    bit11

当触发器位设置为逻辑1时,正常的设备操作(润湿电流激活和轮询)开始。要停止设备操作并使设备处于空闲状态,请将此位解除断言为0。
       在触发设备正常操作后,如果在任何时候需要重新配置设备设置,则需要微控制器首先将位TRIGGER设置为逻辑0以停止设备操作。一旦重新配置完成,微控制器可以将TRIGGER位设置回逻辑1以重新启动设备操作。如果在没有首先停止设备操作的情况下动态地进行重新配置,则可能报告错误的开关状态并可能发出意外中断。

以下寄存器位是例外,当触发器位设置为逻辑1时可以配置:

•TRIGGER (CONFIG寄存器的第11位)

•CRC_T (CONFIG寄存器的第9位)

•rest (CONFIG寄存器的第0位)

•CCP_CFG1寄存器0h =停止TIC12400的正常操作。

 bit0 软复位

1.4IN_EN  0x1B

1.5THRES_COMP  0x21

1.6 Mode  0x32

这个芯片是有默认配置的,先什么都不做,读读默认配置

main函数添加以下代码

说明只有奇偶校验位,其余位全是零,根据读写格式可知,前六位全零没错

将CNOFIG[11]=1

除了CNOFIG[11]变为1 了,其余没变化

data=tic12400read(INT_STAT);printf("INT_STAT:%x\n",data);data=tic12400read(DEVICE_ID);printf("DEVICE_ID:%x\n",data);tic12400write(CONFIG,0x0);data=tic12400read(CONFIG);printf("CONFIG:%x\n",data);tic12400write(IN_EN,0xffffff);data=tic12400read(IN_EN);printf("IN_EN:%x\n",data);tic12400write(THRES_COMP,0x7ff);data=tic12400read(THRES_COMP);printf("THRES_COMP:%x\n",data);tic12400write(CONFIG,0x400);data=tic12400read(CONFIG);printf("CONFIG:%x\n",data);data=tic12400read(IN_STAT_COMP);data=get_data(data);printf("IN_STAT_COMP:%x\n",data);


http://www.ppmy.cn/devtools/116065.html

相关文章

CentOS 中配置 OpenJDK以及多版本管理

以下是在 CentOS 中配置 OpenJDK 的步骤&#xff1a; 一、安装 OpenJDK 使用以下命令检查系统中是否已经安装了 Java&#xff1a; java -version如果已安装&#xff0c;会显示 Java 版本信息。如果未安装&#xff0c;则继续下一步。 使用 yum 安装 OpenJDK&#xff1a; yum ins…

10年计算机考研408-计算机网络

【题33】下列选项中&#xff0c;不属于网络体系结构所描述的内容是&#xff08;&#xff09; A.网络的层次 B.每一层使用的协议 C.协议的内部实现细节 D.每一层必须完成的功能 解析&#xff1a; 本题考查的是网络体系结构相关的概念。 图1描述了网络的7层架构以及每一层所要完成…

UE5-俯视角色移动(蓝图)01

效果如下&#xff1a; 蓝图节点如下&#xff1a; 使用示例自带的移动蓝图&#xff0c;发现角色只能平移&#xff0c;不会转向。必须勾选以下选项&#xff1a; 点击蓝图-》组件-》SpringArm节点。在细节中找到摄像机设置&#xff0c;勾选以下&#xff1a; 在 点击蓝图-》组件-…

数据结构-2.顺序表

1.线性表 线性是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表有: 顺序表 , 链表 , 栈 , 队列... 线性表在逻辑上是线性结构, 也就是连续的一条直线 . 但是在物理结构上并不是连续的, 线性表在物理上存储时, 通常以数组和链式结…

Rocky Linux 9 中添加或删除某个网卡的静态路由的方法

使用ip命令配置临时路由 添加静态路由 ip route add <目的网络> via <下一跳IP> dev <网卡接口名称>例: 给eth0网卡添加一个到达 192.168.2.0/24 网络&#xff0c;下一跳为 192.168.1.254 的路由 ip route add 192.168.2.0/24 via 192.168.1.254 dev eth0…

卡尔曼滤波中Q和R与噪声的关系

卡尔曼滤波 一种用于估计系统状态的递归滤波器&#xff0c;通过融合传感器测量和系统模型&#xff0c;提供系统状态的最优估计。 Q和R是什么 在卡尔曼滤波中&#xff0c;Q和R分别表示过程噪声和测量噪声的协方差矩阵。 Q Q Q矩阵&#xff08;过程噪声协方差矩阵&#xff09;…

git 问题 --- fatal: detected dubious ownership in repository at

在通过 Git Bash 提交项目代码时输入 git pull 或git add . 命令后&#xff0c;报错&#xff1a;fatal: detected dubious ownership in repository at 这是因为该项目的所有者与现在的用户不一致 比如说&#xff1a; 该项目的所有者是 Administrator&#xff0c;而当前用户是…

监控易监测对象及指标之:Kubernetes(K8s)集群的全方位监控策略

随着Kubernetes&#xff08;K8s&#xff09;在云原生架构中的广泛应用&#xff0c;确保集群的高效、稳定运行变得至关重要。监控作为运维管理的核心&#xff0c;对于保障Kubernetes集群的性能和可用性具有不可替代的作用。本文基于监控易的监控指标&#xff0c;探讨了对Kuberne…