这篇介绍的时高精度、速度AD芯片AD7190的驱动,针对STM32,并且使用的时HAL库,改成其他库也很容易,只需要把相关通讯部分改了就行。

  1. SPI设置,首先看AD7190的手册时序图

时序图中已经包含了很多信息,所以SPI配置如下,其中时钟最高为5M,在数据手册中看到的t3有最小时间限制:

  1. 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);
  1. 程序最后解读关键部分

首先芯片的读写是都要先发送要操作的寄存器,然后才是读或者写,这个程序参照了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相关推荐

  1. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  2. stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...

  3. ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)

    参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...

  4. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  5. STM32驱动LCD实战

    目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...

  6. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...

  7. STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)

    STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一.简介   本文基于stm32 Rndis实例,github开源, 使用STM32F407单板.结合协 ...

  8. 【常用芯片】ULN2003工作原理及中文资料(实例:STM32驱动28BYJ48步进电机)

    ULN2003的基本介绍 ULN2003的概述 ULN2003是高耐压.大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成.一般采用DIP-16 或SOP-16 塑料封装. ULN2003的主要特点 ...

  9. STM32驱动WS2812B-2020 RGB彩灯(一)

    STM32驱动WS2812B-2020RGB彩灯(一) 最近搞飞控,看到有些飞控上都使用的RGB彩灯,够酷炫,所以尝试着自己搞一个. 手上的硬件有一块自制的STM32F103最小系统板,一个同事焊好的 ...

最新文章

  1. ospf 环回口的路由条目_OSPF (4)
  2. HTTP请求报文和HTTP响应报文(转)
  3. SQLite第三课 源码编译错误以及解决
  4. Oracle 中对表空间使用情况进行查询
  5. 聊一聊 Redis 数据内部存储使用到的数据结构
  6. linux 如何创建内核进程,Linux内核的进程创建和执行.pdf
  7. framework dyld: Symbol not found: _OBJC_CLASS_xxx
  8. 下载丨53页PDF,云和恩墨技术通讯(2021年4月刊)
  9. git 空提交和重置提交者(转载)
  10. [转载] Python使用list.reverse()返回None
  11. php链接mysql数据库 p_php连接mysql数据库的几种方法
  12. 人脸识别实名制管理,推动智慧工地建设发展
  13. 大学生体育运动网页设计模板代码 DIV布局校园运动网页作业成品 HTML学校网页制作模板 学生简单体育运动网站设计成品
  14. “元宵”大师带你用Python量化交易
  15. 写代码写文章勿有功利心
  16. GPA——平均绩点计算器(5.0分制)
  17. 【机器学习笔记】朴素贝叶斯
  18. 这些好公司955,不加班,你知道几个
  19. 【服务器数据恢复】RAID5多块硬盘离线但是热备盘未激活导致RAID崩溃的数据恢复案例
  20. SaaS 公司如何切入大客户

热门文章

  1. 关于SimpleITK
  2. MySQL数据库安装以及SQL基本增删改查
  3. 微信小程序 - 腾讯地图使用和选点连线计算距离
  4. Git和GitHub Git和Goes版本控制
  5. 《基于 Apache Flink 的流处理》阅读笔记(三)
  6. linux中异或符号,C的|、||、、、异或、~
  7. 2022年理财这个行业怎么样,理财师证书有哪些?
  8. ubuntu查看eigen版本
  9. 一个人久了,会习惯的
  10. 昨日关注:Google旧瓶装新酒 用遗弃技术开发Web新应用