STM32H743与ADS127L11通过SPI通信的实现过程详解
创作时间:
作者:
@小白创作中心
STM32H743与ADS127L11通过SPI通信的实现过程详解
引用
CSDN
1.
https://blog.csdn.net/DVYWUI/article/details/140867541
本文详细介绍了STM32H743与ADC芯片ADS127L11通过SPI通信的实现过程,重点讲解了DMA和FIFO在数据处理中的应用。文章内容包括SPI和DMA的配置、中断函数的编写以及FIFO的实现和使用。
1.简述
STM32h743与adc芯片进行SPI通信,采集到的24位数据通过DMA搬运到指定的8位数组内存区,将24位数据转换成电压值后,通过两个FIFO将数据搬运到存放电压值的内存区。
2.STM32CUBMX配置
2.1 SPI配置如下
2.2 DMA配置
采用线0作为DMA触发同步信号,当线0来一个上升沿则触发一次DMA,并且一次搬运3个字节的数据,同时线0作为ADC芯片的触发信号,一个上升沿触发一次转换,SPI得到3个字节的数据.
3.DMA中断函数
3.1 发送接收半中断函数
注:SPI配置为全双工通信时,半发送和半完成是同时完成,并且半发送和半接收中断函数为同一个,则半发送和半接收都会进入半中断。
3.1.1中断函数的寻找
CUBMX配置完成后生成代码,在 it.c 文件里找到下图函数
跳入接收中断函数,找到XferHalfCpltCallback并跳入
可以看到这是DMA句柄面向对象思想的方法
但半中断函数在启动SPI_DMA传输的函数HAL_SPI_TransmitReceive_DMA中
对象DMA句柄中的半中断和全中断方法被此函数赋值,并且若定义中断函数在此函数里
3.2 中断函数的编写(使用FIFO)
半中断函数中把前一半数据存入FIFOA
全中断函数中把后一半数据存入FIFOB
/**********************************************************************************************************
* function : HAL_SPI_TxRxHalfCpltCallback
* brief : SPI发送接收 半 完成回调函数
* parm : hspi
* return : 无
**********************************************************************************************************/
void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance == SPI1)
{
fifoa_in(&spi_dma_Rx_buffer[0], Rx_Size/2);
flag_A_full = 1;//可以读取 FIFO A
}
}
/**********************************************************************************************************
* function : HAL_SPI_TxRxCpltCallback
* brief : SPI发送接收完成回调函数
* parm : hspi
* return : 无
**********************************************************************************************************/
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance == SPI1)
{
fifob_in(&spi_dma_Rx_buffer[Rx_Size/2], Rx_Size/2);
flag_B_full = 1;//可以读取 FIFO B
}
}
4.FIFO的实现
FIFO的实现可参考此博客:用C语言实现FIFO (简单版_c fifo-CSDN博客
4.1 while循环
while中实现读取FIFO中的数据并把其转换成电压值
判断FIFOA是否存满,若存满,则关闭全局中断,把FIFOA的数据取出数组spi_dma_Outx_FIFO_u8_A里,将其转换为电压值再开启中断,FIFOB依次推理。
while (1)
{
//ads127l11 FIFO测试
if(flag_A_full == 1){
DISABLE_INT(); //禁止中断
fifoa_out(spi_dma_Outx_FIFO_u8_A,Rx_Size/2);
flag_A_full = 0;
for (int i = 0; i < Rx_Size/3/2; i++) {
ads127l11_32bit_data = signExtend(&spi_dma_Outx_FIFO_u8_A[i*3]);
ads127l11_Voltage[i] = (float) (ads127l11_32bit_data * 4096) / 8388608;//计算电压值,变成mv方便观察
}
ENABLE_INT(); //开启中断
}
if(flag_B_full == 1){
DISABLE_INT();
fifob_out(spi_dma_Outx_FIFO_u8_B,Rx_Size/2);
flag_B_full = 0;
for (int i = 0; i < Rx_Size/3/2; i++) {
ads127l11_32bit_data = signExtend(&spi_dma_Outx_FIFO_u8_B[i*3]);
ads127l11_Voltage[i+96] = (float) (ads127l11_32bit_data * 4096) / 8388608;//计算电压值,变成mv方便观察
}
ENABLE_INT();
bsp_LedToggle();
}
本文原文来自CSDN
热门推荐
金融负债知识要点 | 会计分录
挑战极限,拥抱自由——深度探索广州小蛮腰蹦极的魅力与安全实践
茉莉之花:花语与寓意的多重诠释
中国方形“城池”的雏形,或许在这里!五个“首次”认识这个史前聚落
泰拉瑞亚新手攻略:完美开局指南
从主持一哥到彻底淡出,主持人孟非到底经历了什么?
超详细攻略!昆明西山猫猫箐6大徒步路线来袭,走吗?
牛肉包子蒸多长时间?掌握时间密码,解锁松软多汁的美味秘诀!
面食天堂:太原的碳水盛宴,体验太原独特的地道风味
解读传统的手相科学
侯宗原国学易经坤卦与生活的联动
心学问青少年教育,学习动力激发:将学习转化为有趣的游戏和挑战
图片懒加载的四种实现方案
视频监控网络安全风险及防护对策
英超曼彻斯特城VS纽卡斯尔联结果预测:两强相遇,平局收场?
古丈:武陵茶都 心灵原乡
如何让狗狗保持好心情
本科毕业论文格式攻略
敖宏掌舵中国稀土集团3年留下了什么
港媒关注:中国新技术实现“前所未有”的稀土生产速度
新高考背景下,什么是高中生生涯规划?为什么选科和选专业都必须先做好这步?
明朝"联蒙抗金"政策为何失败?林丹汗的昏招成关键
干咳怎么治疗最好最快最有效
招远市公交换新颜,线网调整再优化
过年必备!龙虾蒸制三大绝技,轻松驾驭时间与火候
租房子需要准备什么生活用品 租房必备的十大生活用品推荐
保姆级搬家攻略:这几个打包好物让你0损坏无痛搬家!
争取抚养权的有利证据是什么
医疗保险的钱怎么取出?详细解答来了
项目成本管理主要包括哪些关键要素?