当前位置: 首页 > news >正文

STM32调试TIC12400笔记

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

用的是正点原子的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;
}

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

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

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

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

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

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

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

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

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

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

二、配置芯片 

main函数添加下面代码

串口调试助手

根据时序图可知,触发了上电复位

读INT_STAT寄存器清空标志位


http://www.mrgr.cn/news/30889.html

相关文章:

  • 大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)
  • 【HTTP】方法(method)以及 GET 和 POST 的区别
  • 阿里国际发布最新版多模态大模型Ovis,拿下开源第一
  • 第二证券:金价涨了!创一历史之最!
  • RAG+Agent人工智能平台:RAGflow实现GraphRAG知识库问答,打造极致多模态问答与AI编排流体验
  • 无消息传递的图变换器中的图归纳偏差
  • 各种文件格式对应的ContentType,适用于文件接收与上传下载等场景...
  • SaaS架构:流程架构分析
  • 惠海H6118 DC-DC 降压恒流芯片30V36v40V48V降12V9V24V36V 1.2A大电流 调光降压芯片IC舞台灯
  • 【2025】中医药健康管理小程序(安卓原生开发+用户+管理员)
  • 从《中国数据库前世今生》看中国数据库技术的发展与挑战
  • 记录一次显卡驱动安装
  • 使用mysql-proxy代理服务器上的mysql.sock连接以及mysql-proxy的配置意义及配置示例
  • BLE 协议之链路层
  • 将Python工程打成可执行文件
  • 上手一个RGBD深度相机:从原理到实践--ROS noetic+Astra S(中):RGB相机的标定和使用
  • STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)
  • Python知识点:Python内存管理与优化
  • 第五届“马栏山杯”国际音视频算法大赛创新应用赛投票环节正式启动啦!
  • 支付宝开放平台-开发者社区——AI 日报「9 月 20 日」