STM32驱动AD7190
这篇介绍的时高精度、速度AD芯片AD7190的驱动,针对STM32,并且使用的时HAL库,改成其他库也很容易,只需要把相关通讯部分改了就行。
- SPI设置,首先看AD7190的手册时序图
时序图中已经包含了很多信息,所以SPI配置如下,其中时钟最高为5M,在数据手册中看到的t3有最小时间限制:
- CS引脚可以一直为低的状态,表示一直选中,如果要多片通讯,可以设置为其他,先把驱动程序放出来
#include "ad7190.h"//#define CS_H HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET)//#define CS_L HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET)static AD7190_REG_T ad7190_obj;void init_AD7190_reg_cmds(AD7190_REG_Ptr ad7190_reg_ptr);unsigned char SPIDEV1_single_transfer(unsigned char data_byte){uint8_t data=0;//CS_L;//HAL_Delay(1);HAL_SPI_TransmitReceive(&hspi4, &data_byte, &data, 1, 1000);//HAL_Delay(1);//CS_H;return 0;}int SPIDEV1_transfer(unsigned char *send, unsigned char *receive, unsigned char bytes_num){//uint8_t i=0;//CS_L;//HAL_Delay(1);HAL_SPI_TransmitReceive(&hspi4, send, receive, bytes_num, 5000);//HAL_Delay(1);//CS_H;return 0;}/***************************************************************** Function Name : init_AD7190_reg_cmds* Description : API to initialize the AD7190 commands structure* for communication* Returns : None* Params @ad7190_reg_ptr: Pointer to commands structure****************************************************************/void init_AD7190_reg_cmds(AD7190_REG_Ptr ad7190_reg_ptr){ad7190_reg_ptr->cmd_rd_ID_reg = COM_READ_ID_REG_CMD;ad7190_reg_ptr->cmd_rd_config_reg = COM_READ_CONFIG_REG_CMD;ad7190_reg_ptr->cmd_rd_data_reg = COM_READ_DATA_REG_CMD;ad7190_reg_ptr->cmd_rd_full_scale_reg = COM_READ_FULL_SCALE_REG_CMD;ad7190_reg_ptr->cmd_rd_gpocon_reg = COM_READ_GPCON_REG_CMD;ad7190_reg_ptr->cmd_rd_mode_reg = COM_READ_MODE_REG_CMD;ad7190_reg_ptr->cmd_rd_offset_reg = COM_READ_OFFSET_REG_CMD;ad7190_reg_ptr->cmd_rd_status_reg = COM_READ_STATUS_REG_CMD;ad7190_reg_ptr->cmd_wr_gpocon_reg = COM_WRITE_GPCON_RED_CMD;ad7190_reg_ptr->cmd_wr_config_reg = COM_WRITE_CONFIG_REG_CMD;ad7190_reg_ptr->cmd_wr_mode_reg = COM_WRITE_MODE_REG_CMD;}/***************************************************************** Function Name : init_AD7190_cmds* Description : Initialize the AD7190 commands structure* for communication* Returns : None* Params : None****************************************************************/void init_AD7190_cmds(){init_AD7190_reg_cmds(&ad7190_obj);}/***************************************************************** Function Name : AD7190_configure* Description : Configure/Write to the configuration register* for communication* Returns : (-1) typecast for error, 0 for success* Params @cbyte_2: Data to write to Most Significant Byte* @cbyte_1: Data to write to Middle Byte* @cbyte_0: Data to write to Least Significant Byte****************************************************************/char AD7190_configure(unsigned char cbyte_2, unsigned char cbyte_1, unsigned char cbyte_0){char check_ret = 0x00;unsigned char ad7190_id = 0x00;ad7190_id = AD7190_get_ID();//printf("Initializing AD7190 ADC Device ID = 0x%x\r\n", ad7190_id);/* Go to write to configuration register */check_ret = SPIDEV1_single_transfer(ad7190_obj.cmd_wr_config_reg);/* Write to Most Significant Byte */check_ret = SPIDEV1_single_transfer(cbyte_2);/* Write to Mid Byte */check_ret = SPIDEV1_single_transfer(cbyte_1);/* Write to Least Significant Byte */check_ret = SPIDEV1_single_transfer(cbyte_0);return (check_ret);}/***************************************************************** Function Name : AD7190_mode* Description : Configure/Write to the mode register* for communication* Returns : (-1) typecast for error, 0 for success* Params @mbyte_2: Data to write to Most Significant Byte* @mbyte_1: Data to write to Middle Byte* @mbyte_fs: Data to write to Least Significant Byte****************************************************************/char AD7190_mode(unsigned char mbyte_2, unsigned char mbyte_1, unsigned char mbyte_fs){char check_ret = 0x00;/* Go to write to configuration register */check_ret = SPIDEV1_single_transfer(ad7190_obj.cmd_wr_mode_reg);/* Write to Most Significant Byte */check_ret = SPIDEV1_single_transfer(mbyte_2);/* Write to Mid Byte */check_ret = SPIDEV1_single_transfer(mbyte_1);/* Write to Least Significant Byte */check_ret = SPIDEV1_single_transfer(mbyte_fs);//add new gpocon 打开switchcheck_ret = SPIDEV1_single_transfer(ad7190_obj.cmd_wr_gpocon_reg);check_ret = SPIDEV1_single_transfer(0x40);return (check_ret);}/***************************************************************** Function Name : AD7190_read_status_reg* Description : Read the status register* Returns : Contents of the status register* Params : None****************************************************************/unsigned char AD7190_read_status_reg(){unsigned char status_reg = 0x00;SPIDEV1_single_transfer(ad7190_obj.cmd_rd_status_reg);status_reg = SPIDEV1_single_transfer(0x00);return (status_reg);}/***************************************************************** Function Name : AD7190_get_ID* Description : Read the ID register* Returns : Contents of the ID register* Params : None****************************************************************/unsigned char AD7190_get_ID(){unsigned char ad7190_ID = 0x00;SPIDEV1_single_transfer(ad7190_obj.cmd_rd_gpocon_reg);ad7190_ID = SPIDEV1_single_transfer(0x00);return (ad7190_ID);}/***************************************************************** Function Name : AD7190_reset* Description : Resets the AD7190* Returns : None* Params : None****************************************************************/void AD7190_reset(){char cnt;for(cnt = 0 ; cnt < 55; cnt++)SPIDEV1_single_transfer(0xFF);}/***************************************************************** Function Name : AD7190_read_data* Description : Read the data register* Returns : Contents of the data register* Params : None****************************************************************/int AD7190_read_data(void){unsigned char Tx_bytes[]={0xff,0xff,0xff}, Rx_bytes[3] = {0,0,0}, reg_status = 0, drdy_bit;int adc_data = 0x00;//memset(Tx_bytes, 0xFF, sizeof(Tx_bytes));//memset(Rx_bytes, 0, sizeof(Rx_bytes));drdy_bit = 1;reg_status = AD7190_read_status_reg();drdy_bit = reg_status & 0x80;if (drdy_bit == 0x00){SPIDEV1_single_transfer(ad7190_obj.cmd_rd_data_reg);if (SPIDEV1_transfer(Tx_bytes, Rx_bytes, 3) == 0){adc_data = (adc_data | Rx_bytes[0]) << 8;adc_data = (adc_data | Rx_bytes[1]) << 8;adc_data = adc_data | Rx_bytes[2];//printf("%lu\r\n",adc_data);}else{//printf("(AD7190_read_test)Transaction Failed\r\n");adc_data = 0xffffffff;}}else{adc_data = 0xffffffff;}return (adc_data);}/***************************************************************** Function Name : AD7190_dump_regs* Description : Dump the contents of the registers* Returns : None* Params @regs_to_dump: Registers to dump****************************************************************/void AD7190_dump_regs(REG_DumpT regs_to_dump){unsigned char Tx_bytes[3]={0xff,0xff,0xff}, Rx_bytes[3] = {0,0,0}, reg_status_id = 0;unsigned long read_config_mode = 0x00;//memset(Tx_bytes, 0xFF, sizeof(Tx_bytes));//memset(Rx_bytes, 0, sizeof(Rx_bytes));switch(regs_to_dump){case DUMP_CONFIG_REG_CONTENTS:SPIDEV1_single_transfer(ad7190_obj.cmd_rd_config_reg);if (SPIDEV1_transfer(Tx_bytes, Rx_bytes, 3) == 0){read_config_mode = (read_config_mode | Rx_bytes[0]) << 8;read_config_mode = (read_config_mode | Rx_bytes[1]) << 8;read_config_mode = read_config_mode | Rx_bytes[2];//printf("Dump - Configuration Register = 0X%x\r\n",read_config_mode);}else{//printf("(AD7190_dump_regs)Transaction Failed\r\n");}break;case DUMP_MODE_REG_CONTENTS:SPIDEV1_single_transfer(ad7190_obj.cmd_rd_mode_reg);if (SPIDEV1_transfer(Tx_bytes, Rx_bytes, 3) == 0){read_config_mode = (read_config_mode | Rx_bytes[0]) << 8;read_config_mode = (read_config_mode | Rx_bytes[1]) << 8;read_config_mode = read_config_mode | Rx_bytes[2];//printf("Dump - Mode Register = 0X%x\r\n",read_config_mode);}else{//printf("(AD7190_dump_regs)Transaction Failed\r\n");}break;case DUMP_STATUS_REG_CONTENTS:reg_status_id = AD7190_read_status_reg();//printf("Dump - Status Register = 0X%x\r\n",reg_status_id);break;case DUMP_ID_REG_CONTENTS:reg_status_id = AD7190_get_ID();//printf("Dump - ID Register = 0X%x\r\n",reg_status_id);break;case DUMP_CONFIG_AND_MODE_REG_CONTENTS:default://SPIDEV1_single_transfer(ad7190_obj.cmd_rd_config_reg);//if (SPIDEV1_transfer(Tx_bytes, Rx_bytes, 3) == 0)//{// read_config_mode = (read_config_mode | Rx_bytes[0]) << 8;// read_config_mode = (read_config_mode | Rx_bytes[1]) << 8;// read_config_mode = read_config_mode | Rx_bytes[2];// //printf("Dump - Configuration Register = 0X%x\r\n",read_config_mode);//}//else//{// //printf("(AD7190_dump_regs)Transaction Failed\r\n");//}//memset(Rx_bytes, 0, sizeof(Rx_bytes));//read_config_mode = 0x00;SPIDEV1_single_transfer(ad7190_obj.cmd_rd_mode_reg);if (SPIDEV1_transfer(Tx_bytes, Rx_bytes, 3) == 0){read_config_mode = (read_config_mode | Rx_bytes[0]) << 8;read_config_mode = (read_config_mode | Rx_bytes[1]) << 8;read_config_mode = read_config_mode | Rx_bytes[2];//printf("Dump - Mode Register = 0X%x\r\n",read_config_mode);}else{//printf("(AD7190_dump_regs)Transaction Failed\r\n");}break;}}
下面时ad7190.h文件
#include "stm32h7xx_hal.h"#include "main.h"#ifndef AD7190_H_#define AD7190_H_/* Commands to write to specific registers */#define COM_WRITE_CONFIG_REG_CMD 0x10#define COM_WRITE_MODE_REG_CMD 0x08#define COM_WRITE_GPCON_RED_CMD 0x28/* Commands to read from specific registers */#define COM_READ_CONFIG_REG_CMD 0x50#define COM_READ_STATUS_REG_CMD 0x40#define COM_READ_MODE_REG_CMD 0x48#define COM_READ_DATA_REG_CMD 0x58#define COM_READ_GPCON_REG_CMD 0x68#define COM_READ_ID_REG_CMD 0x60#define COM_READ_OFFSET_REG_CMD 0x70#define COM_READ_FULL_SCALE_REG_CMD 0x78/* Sampling Rates */#define FS_60_HZ 0x50#define FS_300_HZ 0x10#define FS_960_HZ 0x05#define FS_2400_HZ 0x02#define FS_4800_HZ 0x01/* Register settings commands for Configuration Register */#define CONFIG_REG_CMD_MSB 0x00#define CONFIG_REG_CMD_MID 0x01/*May have to change Gain depending on input signal voltageSee Table 19 in AD7190 datasheet for more information*/#define CONFIG_REG_CMD_LSB 0x01//0x1F/* Register settings commands for Mode Register */#define MODE_REG_CMD_MSB 0x08#define MODE_REG_CMD_MID 0x00#define MODE_REG_CMD_LSB FS_4800_HZ/* Read the data register continously and place the data on DOUT *///#define COMM_REG_CREAD 0x5C/* Structure Map of AD7190 internal registers* for read and write operations*/typedef struct{unsigned char cmd_rd_status_reg;unsigned char cmd_wr_mode_reg;unsigned char cmd_rd_mode_reg;unsigned char cmd_wr_config_reg;unsigned char cmd_rd_config_reg;unsigned char cmd_rd_data_reg;unsigned char cmd_rd_ID_reg;unsigned char cmd_rd_gpocon_reg;unsigned char cmd_wr_gpocon_reg;unsigned char cmd_rd_offset_reg;unsigned char cmd_rd_full_scale_reg;}AD7190_REG_T, *AD7190_REG_Ptr;/* Enum commands to dump register contents */typedef enum{DUMP_CONFIG_REG_CONTENTS,DUMP_MODE_REG_CONTENTS,DUMP_STATUS_REG_CONTENTS,DUMP_ID_REG_CONTENTS,DUMP_CONFIG_AND_MODE_REG_CONTENTS}REG_DumpT;/* AD7190 API's */void init_AD7190_reg_cmds(AD7190_REG_Ptr ad7190_reg_ptr);void init_AD7190_cmds(void);char AD7190_configure(unsigned char cbyte_2, unsigned char cbyte_1, unsigned char cbyte_0);char AD7190_mode(unsigned char mbyte_2, unsigned char mbyte_1, unsigned char mbyte_fs);unsigned char AD7190_read_status_reg(void);unsigned char AD7190_get_ID(void);void AD7190_reset(void);int AD7190_read_data(void);void AD7190_dump_regs(REG_DumpT regs_to_dump);#endif /* AD7190_H_ */
最后初始化
init_AD7190_cmds();AD7190_reset();HAL_Delay(20);AD7190_configure(CONFIG_REG_CMD_MSB, CONFIG_REG_CMD_MID, CONFIG_REG_CMD_LSB);AD7190_mode(MODE_REG_CMD_MSB, MODE_REG_CMD_MID, MODE_REG_CMD_LSB);
- 程序最后解读关键部分
首先芯片的读写是都要先发送要操作的寄存器,然后才是读或者写,这个程序参照了github上面的,做了改进,在AD7190_mode中打开了基准电压AGND的开关,
//add new gpocon 打开switch
check_ret = SPIDEV1_single_transfer(ad7190_obj.cmd_wr_gpocon_reg);
check_ret = SPIDEV1_single_transfer(0x40);
内部原理图如下,必须要打开开关才能正常使用
其他的在注释中已经有详细的说明,具体还可以参照数据手册
STM32驱动AD7190相关推荐
- 关于STM32驱动DS1302实时时钟的一点思考
关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...
- stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...
- ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)
参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...
- stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)
RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...
- STM32驱动LCD实战
目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...
- STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...
- STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)
STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一.简介 本文基于stm32 Rndis实例,github开源, 使用STM32F407单板.结合协 ...
- 【常用芯片】ULN2003工作原理及中文资料(实例:STM32驱动28BYJ48步进电机)
ULN2003的基本介绍 ULN2003的概述 ULN2003是高耐压.大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成.一般采用DIP-16 或SOP-16 塑料封装. ULN2003的主要特点 ...
- STM32驱动WS2812B-2020 RGB彩灯(一)
STM32驱动WS2812B-2020RGB彩灯(一) 最近搞飞控,看到有些飞控上都使用的RGB彩灯,够酷炫,所以尝试着自己搞一个. 手上的硬件有一块自制的STM32F103最小系统板,一个同事焊好的 ...
最新文章
- ospf 环回口的路由条目_OSPF (4)
- HTTP请求报文和HTTP响应报文(转)
- SQLite第三课 源码编译错误以及解决
- Oracle 中对表空间使用情况进行查询
- 聊一聊 Redis 数据内部存储使用到的数据结构
- linux 如何创建内核进程,Linux内核的进程创建和执行.pdf
- framework dyld: Symbol not found: _OBJC_CLASS_xxx
- 下载丨53页PDF,云和恩墨技术通讯(2021年4月刊)
- git 空提交和重置提交者(转载)
- [转载] Python使用list.reverse()返回None
- php链接mysql数据库 p_php连接mysql数据库的几种方法
- 人脸识别实名制管理,推动智慧工地建设发展
- 大学生体育运动网页设计模板代码 DIV布局校园运动网页作业成品 HTML学校网页制作模板 学生简单体育运动网站设计成品
- “元宵”大师带你用Python量化交易
- 写代码写文章勿有功利心
- GPA——平均绩点计算器(5.0分制)
- 【机器学习笔记】朴素贝叶斯
- 这些好公司955,不加班,你知道几个
- 【服务器数据恢复】RAID5多块硬盘离线但是热备盘未激活导致RAID崩溃的数据恢复案例
- SaaS 公司如何切入大客户