【STM32L496】使用HAL库实现SPI写入/读取数据(AD5421)

这篇具有很好参考价值的文章主要介绍了【STM32L496】使用HAL库实现SPI写入/读取数据(AD5421)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SPI原理

SPI协议详解(图文并茂+超详细)
SPI超详细解析
【STM32笔记】HAL库中的SPI传输(可利用中断或DMA进行连续传输)

AD5421芯片了解

AD5421是一款集成器件,设计用于环路供电型4-20mA智能发射器应用。AD5421在单芯片内提供如下特性和功能:16位DAC和电流放大器,用于对环路电流进行数字控制;用于为整个发射器供电的稳压器;基准电压源;故障报警功能;灵活的SPI兼容型串行接口;增益和失调调整寄存器;以及其它特性和功能。

AD5421为四线制信号芯片,这四个信号线分别为MISO、MOSI、CS、SCLK,即主入从出、主出从入、片选、时钟。片选信号线在有的地方也称SS,其是由主设备控制的,用来确定从机且低电平有效。当编写程序时,通常采用GPIO模拟片选信号(人为拉低pin电平)。
在本文,需要利用AD5421实现写入和读取数据的功能,首先通过芯片手册可以看到,实现写入功能的第八位是0,读取是1。
hal库 spi,stm32,单片机,嵌入式硬件
数据格式为8位命令+16位数据(+8位CRC循环校验)
hal库 spi,stm32,单片机,嵌入式硬件
AD5421数据传输时序图如下图所示,当SYNC为低电平时有效,此时,当SCLK为下降沿时传输数据,当SYNC为高电平时,输入的数据会锁存。
hal库 spi,stm32,单片机,嵌入式硬件

HAL库配置及初始化

根据芯片手册配置引脚和SPI引脚模式参数,开启中断。
hal库 spi,stm32,单片机,嵌入式硬件
hal库 spi,stm32,单片机,嵌入式硬件
hal库 spi,stm32,单片机,嵌入式硬件

hal库 spi,stm32,单片机,嵌入式硬件
SPI的片选信号设置为GPIO_Output,低电平有效,传输速度Low
hal库 spi,stm32,单片机,嵌入式硬件
配置完成后,同I2C一样,会生成一个SPI 的句柄。

SPI_HandleTypeDef hspi2;

部分代码

通过AD5421实现SPI通信
以下是基于HAL库的SPI收发函数,主要用到HAL_SPI_TransmitHAL_SPI_Receive这两个函数实现,这两个函数相对应的就是HAL_SPI_Transmit_ITHAL_SPI_Receive_IT,这两个函数和前两个函数的差别就是,前者是在阻塞模式下发送和接收消息,而后者是利用中断在非阻塞的模式下发送接收消息,前两个函数无法连续发送或接收消息,而后两个函数可以连续发送或接收消息。除此以外,还有用DMA直接存储模式读写消息,使用示波器也可以看到相关波形,这里没有演示,可以查看文章开头的第三个链接,里面有对这几个函数比较详细的解释。
HAL_GPIO_WritePin (SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_RESET);就是之前一直在讲的软件片选,人为拉高置低电平,启动SPI收发数据。

//this spi's transmisson can not continuous transmission of data.start
int spi_transmit(uint8_t *tpdat,uint16_t tdsize)
{	
	HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_RESET);	
	if(tpdat != NULL || tdsize > 0)
	{
		HAL_SPI_Transmit(&hspi2,tpdat,tdsize,0xFFFF);
		HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_SET);
		delay_ms(10);
		return 1;
	}
	else
	{
		HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_SET);
		return 0;
	}
}
int spi_receive(uint8_t *rpdat,uint16_t rdsize)
{
	HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_RESET);	
	if(rpdat != NULL || rdsize > 0)
	{
		HAL_SPI_Receive(&hspi2,rpdat,rdsize,0xFFFF);
		HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_SET);
		delay_ms(10);
		return 1;
	}
	else
	{
		HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_SET);
		return 0;
	}
}
//this spi's transmisson can not continuous transmission of data.end

AD5421的读写数据函数,输入移位寄存器为24位(如果需要对数据进行CRC纠错校验,则为32位,这里没用到)。
24/32位字宽的数据在串行时钟输入SCLK的控制下优先载入器件的MSB位,所以在wbuf[1]时需要把data右移八位。
输入移位寄存器由8位地址/命令字节、16位数据字和可选的8位CRC组成。

写序列开始于SYNC信号的下降沿,数据在SCLK下降沿通过SDIN数据线输入。在SYNC上升沿,24位数据被锁存,然后传输到相关的寄存器并执行规定的功能(DAC输出改变或工作模式改变)。

void ad5421_write(uint8_t wadd,uint16_t data)
{
	uint8_t wbuf[3];
	memset(wbuf,0,sizeof(wbuf));
	wbuf[0]=wadd&0x7F;
	wbuf[1]=data>>8;
	wbuf[2]=data&0x00FF;
	spi_transmit(wbuf,3);
}

uint16_t ad5421_read(uint8_t radd)
{
	uint8_t rbuf[3];
	uint8_t read[3];
	memset(rbuf,0,sizeof(rbuf));
	rbuf[0]=radd;
	rbuf[1]=0;
	rbuf[2]=0;
	spi_transmit(rbuf,3);
	
	rbuf[0]=0x09;	
	rbuf[1]=0;	
	rbuf[2]=0;	
	HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_RESET);	
//	HAL_SPI_Transmit(&hspi2,rbuf,1,0xFFFF);
//	HAL_SPI_Receive(&hspi2,rbuf,2,0xFFFF);
	
	HAL_SPI_TransmitReceive(&hspi2,rbuf,read,3,0xFFFF);
	HAL_GPIO_WritePin	(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_SET);	
	
	return (read[1]<<8)|(read[2]&0xFF);
}

在这里有一个函数HAL_SPI_TransmitReceive这个函数是指在阻塞状态下发送或接收一段数据,该函数在文件stm32l4xx_hal_spi.c下。

/**
  * @brief  Transmit and Receive an amount of data in blocking mode.
  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains
  *               the configuration information for SPI module.
  * @param  pTxData pointer to transmission data buffer
  * @param  pRxData pointer to reception data buffer
  * @param  Size amount of data to be sent and received
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout);

遇到的问题

SPI和I2C的代码编写步骤相似,思路也比较相像,但由于SPI读写寄存器这个完成了有一段时间了,所以遇到了什么问题其实印象有点模糊了,如果想到什么再加吧。
后面在实现读芯片温度和读VLoop功能时有遇到过问题,下文再述。文章来源地址https://www.toymoban.com/news/detail-770228.html

到了这里,关于【STM32L496】使用HAL库实现SPI写入/读取数据(AD5421)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 通过HAL库实现双机SPI程序烧录之一SPI双机通信

    主要功能:STM32F407VET6作为主机,STM32F103ZET6作为从机实现F4通过SPI接口发送数据给F1进行串口打印功能 主要是使用STM32cubemx进行相关配置(使用这个软件不能只用于生成代码,要学会读懂生成的每一句代码这样才方便后期调试,不然出现问题根本找不到) 选择Serial Waire进行调试

    2024年02月08日
    浏览(19)
  • STM32L4 HAL库通过串口通信改变PWM占空比

    使用串行通信的目的是为了让上位机能控制STM32来改变PWM的输出 这里用的是定时器TIM4的3通道,当然也可以改为其他的定时器,具体请参考手册 偷下懒,直接拿正点原子的例子程序修改了一下。 示例用的是UART1 引脚是PA9(TX),PA10(RX) 主要修改的地方在接收数据的部分,我用l

    2024年02月15日
    浏览(20)
  • STM32CubeMX配置HAL库实现SPI-DMA的递归调用

    核心: STM32F407ZET6   外设ADC: ADS1258   数量:3个   ※ 核心与3个ADC使用SPI总线 “一主多从” 方式连接,PCB布线的方式与下图一致。 ※ 在电路板上STM32与三个ADS1258在同一直线上分布,STM32在一端,三个ADC依次排布。 ※ 离STM32最远ADC的DRDY硬件管脚与STM32的EXTI line4 interrupt连接

    2024年02月15日
    浏览(22)
  • 【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总)

    【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总) 此文章是讨论将先前所有的低功耗配置功能整合起来的一个库(适用于STM32L4系列) 目前除了普通唤醒方式外 加入了UART唤醒和RTC唤醒配置 如果后续有更多唤醒加入(如I2C等 将直接在后续的文章

    2024年02月19日
    浏览(19)
  • STM32软件模拟实现IIC写入和读取AT24C02(STM32CubeMx配置)

    IIC:Inter Integrated Circuit,集成电路总线,是一种 同步 串行 半双工 通信总线。 在使用IIC时分为硬件IIC以及软件IIC,下图为两者的区别: 在使用IIC前先来了解一下IIC总线结构图,即下图: 从图中可以看出IIC有两个双向信号线,一根是数据线SDA,一根是时钟线SCL,并且都接上拉

    2024年02月04日
    浏览(19)
  • STM32CubeMx实现ADC多通道+DMA读取(HAL库)

    目录 一、实验结果  二、STM32CubeMx配置 三、main.c测试代码 1、RCC配置 (外部晶振选择8MHz。设置相应的分频器M=8,倍频器倍频系数N=336,分频器分频系数P=2,那么主PLL生成的第一个输出高速时钟PLLP为:168MHz)  2、SYS配置  3、ADC(规则)通道配置(独立模式,预分频4分频,1

    2024年02月15日
    浏览(16)
  • STM32 HAL库 STM32CubeMX -- SPI

    SPI (Serial Peripheral Interface)协议,即串行外围设备接口,是一种高速全双工的通信总线。 它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合。 SPI 通讯使用3 条总线及片选线, 3 条总线分别为SCK、MOSI、MISO,片选线为SS(CS) ,它们的作用介绍如下: (1) SS( Slav

    2024年02月13日
    浏览(26)
  • STM32F429 Discovery开发板应用:实现SPI-SD Card文件写入(搭载FatFS文件系统)

    MCU:STM32F429ZIT6 开发环境:STM32CubeMX+MDK5   外购了一个SPI接口的SD Card模块,想要实现SD卡存储数据的功能。 首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找到开发板对应封装的MCU型号,双击打开(图中第三)。   此时,双击完后会关闭此界面,然后打开一个新界面。

    2024年02月08日
    浏览(22)
  • STM32使用HAL库SPI驱动W25Q16 使用FATFS文件系统+USB虚拟U盘

    使用stm32F407驱动W25Q16,使用FATFS文件系统,USB虚拟优盘功能,W25Q16一共512个扇区,其中128作为flash存取相关数据,其他的384个扇区用作虚拟U盘使用 W25Q16.c W25Q16.h user_diskio.c usbd_storage_if.c main.c STORAGE_BLK_NBR 表示扇区数量 STORAGE_BLK_SIZ 表示扇区大小 电脑上的U盘容量跟这两个参数密

    2024年04月28日
    浏览(20)
  • STM32 HAL库 SPI主从双机通信

    最近因为项目需求,需要在一块板子内实现一个主机和五个从机的通信; 主机平台选用的是STM32F407VGT6,从机平台选用的是STM32F103C8T6;通信总线选用的是SPI总线。在构想是觉得采用SPI进行主从通信会很简单,但在实际开发的过程中,各种坑,通信时而正常时而混乱。不过在不

    2024年01月17日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包