接线

AD7124部分

单片机部分


SPI部分驱动代码.c

#include "main.h"//SPI0 初始化
void SPI0_Init(void)
{spi_parameter_struct spi_init_struct;rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_SPI0);rcu_periph_clock_enable(RCU_AF);/* SPI0 GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);/* deinitilize SPI and the parameters */spi_i2s_deinit(SPI0);spi_struct_para_init(&spi_init_struct);/* SPI0 parameter config */spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;spi_init_struct.device_mode          = SPI_MASTER;spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;spi_init_struct.nss                  = SPI_NSS_SOFT;spi_init_struct.prescale             = SPI_PSC_128;spi_init_struct.endian               = SPI_ENDIAN_MSB;spi_init(SPI0, &spi_init_struct);spi_enable(SPI0);SPI0_ReadWriteByte(0xff);
}//SPI0 字节读写
uint8_t SPI0_ReadWriteByte(uint8_t TxData)
{uint8_t retry=0;while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)){retry++;if(retry>250){return 0;}}spi_i2s_data_transmit(SPI0, TxData); //通过外设SPIx发送一个数据retry=0;while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)){retry++;if(retry>250){return 0;}}return spi_i2s_data_receive(SPI0); //返回通过SPIx最近接收的数据
}//SPI0 连续写
void SPI_Write(uint8_t * buf,uint8_t size)
{int i=0;for(i=0;i<size;i++)SPI0_ReadWriteByte(buf[i]);
}//SPI0 连续读
void SPI_Read(uint8_t * buf,uint8_t size)
{int i=0;for(i=0;i<size;i++)buf[i]=SPI0_ReadWriteByte(0x00);
}

SPI部分驱动代码.h

#ifndef _SPI_H_
#define _SPI_H_
#include "main.h"void SPI0_Init(void);
uint8_t SPI0_ReadWriteByte(uint8_t TxData);
void SPI_Write(uint8_t * buf,uint8_t size);
void SPI_Read(uint8_t * buf,uint8_t size);#endif //EXTI_6

AD7124驱动.c

#include "main.h"AD7124_DATA AD7124_Data;
//AD7124 初始化
void AD7124_Init(void)
{//引脚初始化rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);gpio_init(AD7124_CS_GPIO_Port,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,AD7124_CS_Pin);gpio_init(AD7124_SYNC_GPIO_Port,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,AD7124_SYNC_Pin);gpio_bit_set(AD7124_SYNC_GPIO_Port,AD7124_SYNC_Pin);EXIT_PA6_Config();  //外部中断配置 MISO引脚SPI0_Init();      //SPI初始化AD7124_CS_H;         //片选拉高rt_thread_mdelay(20);AD7124_Reset();      //复位AD7124AD7124_CS_L; rt_thread_mdelay(100);AD7124_Config();     //配置AD7124
}//MISO引脚 中断配置
void EXIT_PA6_Config(void)
{/* enable the AF clock */rcu_periph_clock_enable(RCU_AF);nvic_irq_enable(EXTI5_9_IRQn, 1, 4);/* connect key EXTI line to key GPIO pin */gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_6);/* configure key EXTI line */exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_interrupt_flag_clear(EXTI_6);
}//AD7124 芯片复位
void AD7124_Reset(void)
{unsigned char reset_code[8] = {0xff};AD7124_CS_L;rt_thread_mdelay(10);SPI_Write(reset_code,8);AD7124_CS_H;rt_thread_mdelay(10);
}//SPI发送数据
void AD7124_SendByte(unsigned char data)
{unsigned char cmd;cmd = data;SPI_Write(&cmd,1);
}//AD7124 芯片配置
void AD7124_Config(void)
{AD7124_SendByte(0x09);//写入通道寄存器1  CHANNEL_0AD7124_SendByte(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换AD7124_SendByte(0x91);//AIN4 AVssAD7124_SendByte(0x0A);//写入通道寄存器0  CHANNEL_1AD7124_SendByte(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换AD7124_SendByte(0xB1);//AIN5 AVssAD7124_SendByte(0x0B);//写入通道寄存器0  CHANNEL_2AD7124_SendByte(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换AD7124_SendByte(0x85);//AIN4 AIN5AD7124_SendByte(0x19);//写入配置寄存器0 CONFIG_0AD7124_SendByte(0x09);//选择双极型模式、关闭检测电流源、使能AIN BUFAD7124_SendByte(0x70);//选择neibu基准源,增益配置为+-1.25VAD7124_SendByte(0x1A);//写入配置寄存器0 CONFIG_1AD7124_SendByte(0x09);//选择双极型模式、关闭检测电流源、使能REF BUF与AIN BUF,选择neibu基准源,增益配置为+-2.5V;AD7124_SendByte(0x70);//1倍增益 使能AIN BUFAD7124_SendByte(0x1B);//写入配置寄存器0 CONFIG_2AD7124_SendByte(0x09);//选择双极型模式、关闭检测电流源、使能REF BUF与AIN BUF,选择neibu基准源,增益配置为+-2.5V;AD7124_SendByte(0x70);//1倍增益 使能AIN BUFAD7124_SendByte(0x21);//写入滤波寄存器寄存器,FILTER_0 (datasheet Page 89)AD7124_SendByte(0x06);AD7124_SendByte(0x00);AD7124_SendByte(0x80);//FS=128,使用多通道序列器时,转换时间为建立时间的总和,建立时间大于转换时间。AD7124_SendByte(0x22);//写入滤波寄存器寄存器,FILTER_1 (datasheet Page 89)AD7124_SendByte(0x06);AD7124_SendByte(0x00);AD7124_SendByte(0x80);//FS=128,使用多通道序列器时,转换时间为建立时间的总和,建立时间大于转换时间。AD7124_SendByte(0x23);//写入滤波寄存器寄存器,FILTER_2 (datasheet Page 89)AD7124_SendByte(0x06);AD7124_SendByte(0x00);AD7124_SendByte(0x80);//FS=128,使用多通道序列器时,转换时间为建立时间的总和,建立时间大于转换时间。AD7124_SendByte(0x01);//写入ADC控制寄存器,ADC_CONTROL (datasheet Page 78)AD7124_SendByte(0x0D);//使能连续读取,全功率模式,使用内部614.4kHz时钟源,连续工作模式,使能 DATA_STATUS以输出状态寄存器,用于分辨通道数据AD7124_SendByte(0xC0);
}//读取AD 的ID
unsigned char AD7124_ReadID(void)
{unsigned char readid = 0x45,id;SPI_Write(&readid,1);rt_thread_mdelay(10);SPI_Read(&id,1);return id;
}//外部中断函数
void EXTI5_9_IRQHandler(void)
{unsigned char ReadData[4]={0x00};rt_interrupt_enter();nvic_irq_disable(EXTI5_9_IRQn);if (RESET != exti_interrupt_flag_get(EXTI_6))  {exti_interrupt_flag_clear(EXTI_6);}SPI_Read(ReadData,4);ReadData[3] = ReadData[3]&0x0f;switch(ReadData[3]){case 0:   AD7124_Data.ADC_VAL = (((uint32_t)ReadData[0])<<16)+(((uint32_t)ReadData[1])<<8)+ReadData[2];AD7124_Data.AIN_P = (((float)AD7124_Data.ADC_VAL-0x800000))/0x800000*2500;break;case 1:AD7124_Data.ADC_VAL = (((uint32_t)ReadData[0])<<16)+(((uint32_t)ReadData[1])<<8)+ReadData[2];AD7124_Data.AIN_N = (((float)AD7124_Data.ADC_VAL-0x800000))/0x800000*2500;break;case 2:AD7124_Data.ADC_VAL = (((uint32_t)ReadData[0])<<16)+(((uint32_t)ReadData[1])<<8)+ReadData[2];AD7124_Data.AIN_P_N = (((float)AD7124_Data.ADC_VAL-0x800000))/0x800000*2500000;break;default:break;}nvic_irq_enable(EXTI5_9_IRQn, 1, 4);rt_interrupt_leave();
}

AD7124驱动.h

#ifndef __AD7124_H
#define __AD7124_H
#include "main.h"#define AD7124_CS_Pin         GPIO_PIN_4
#define AD7124_CS_GPIO_Port   GPIOA
#define AD7124_SYNC_Pin       GPIO_PIN_0
#define AD7124_SYNC_GPIO_Port GPIOB#define AD7124_CS_L gpio_bit_reset(AD7124_CS_GPIO_Port, AD7124_CS_Pin);
#define AD7124_CS_H gpio_bit_set(AD7124_CS_GPIO_Port, AD7124_CS_Pin);typedef struct
{long  ADC_VAL;float AIN_P;float AIN_N;float AIN_P_N;
}AD7124_DATA;extern AD7124_DATA AD7124_Data;void AD7124_Init(void);
void AD7124_Reset(void);
unsigned char AD7124_ReadID(void);
void AD7124_Config(void);
void EXIT_PA6_Config(void);
#endif

测试代码

void main(void)
{//AD7124 初始化AD7124_Init();delay_ms(200);while(1){//电压值在中断中获取delay_ms(30);}
}

AD7124驱动代码(基于GD32F103 SPI)相关推荐

  1. FPGA Verilog AD7606驱动代码,包含SPI模式读取和并行模式读取两种

    FPGA Verilog AD7606驱动代码,包含SPI模式读取和并行模式读取两种,代码注释详细 编号:7428665912784264白衫如初oh

  2. MS5611大气压强传感器驱动代码(基于GD32F103)

    ms5611驱动代码.c #include "main.h"stru_MS5611_DATA MS5611_DATA={0};const uint8_t ms5611_reset_ ...

  3. SHT31/85温湿度传感器驱动代码(基于GD32F103)

    IIC驱动.c部分 #include "main.h" void IIC_SDA(uint8_t status) {if(status == 1){gpio_bit_set(SDA ...

  4. HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库

    HIH8121温湿度传感器代码基于STM32 HAL库 HIH8121传感器简介 驱动代码.c 驱动代码.h main函数 HIH8121传感器简介 HIH8121是霍尼韦尔公司生产的测量温湿度参数一 ...

  5. STM32之 W25Q128闪存(SPI协议)驱动代码(程序稳定,清晰明了)

    第一部分:W25Q128代码头文件 (W25Q128.h) #ifndef W25Q128_H #define W25Q128_H #include "stm32f10x.h" # ...

  6. 基于驱动框架编写驱动代码

    前言:基于上一个博文对 linux驱动的认知的了解,那么现在开始我们正式来进入学习基于驱动框架来编写驱动代码,那么接下来我们先来看看一个最简单的驱动框架代码 一.字符设备驱动框架代码与应用层代码 驱动 ...

  7. 基于STM32F103的步进电机(ULN2003/28BYJ-48)角度和转速控制详细资料和驱动代码

    基于STM32F103的步进电机(ULN2003/28BYJ-48)角度和转速控制详细资料和驱动代码 详细资料 1.技术参数 参数 值 参数 值 电压VDC 12 空载牵入频率 Hz ≥500 直流电 ...

  8. 基于Sata3.0固态硬盘接口协议verilog驱动代码

    基于Sata3.0固态硬盘接口协议verilog驱动代码 Verilog程序源代码. vivado2017.4开发. 可自适应3.0,2.0速率, 可扩展也磁盘矩阵,支持不同数据包读写 带有测速功能, ...

  9. 基于STM32的LTC6804驱动代码解析

    在上次项目中用到了LTC6804这块片子,初次使用它的采集精度确实令我惊讶到了,设备用于监测2V的铅酸电池组,硬件上几乎没有加任何滤波,直接读取数据就能达到3mv以下的精度,片子真的很好用. 下面总结 ...

  10. 【STM32】基于STM32CubeIDE SPI+DMA驱动WS2812

    [STM32]基于STM32CubeIDE SPI+DMA驱动WS2812 ✨申明:本文章仅发表在CSDN网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创!

最新文章

  1. 发际线有救了!这款app可一键AI生发,拯救你的自拍焦虑
  2. jquery初始化的三种方式
  3. 服务机器人---充电桩
  4. 恒丰银行深夜紧急澄清!“我行与建设银行的报道严重不实”!恒丰银行称目前自身经营稳定有序
  5. php下intval()和(int)转换使用与区别
  6. 酒鬼随机漫步(一个矢量类)
  7. SpringBoot入门之内嵌Tomcat配置
  8. 用于科研的移动机器人平台推荐
  9. C#中几种数据库的大数据批量插入
  10. 【LeetCode笔记】301. 删除无效的括号(Java、DFS、字符串)
  11. eclipse中JS文件乱码
  12. ECMAScript 的发展历史
  13. 原创 leetcode/力扣 背包问题大总结,BAT程序员完整学习手册PDF开放下载!
  14. echarts词云图实现_系统讲解如何用Python制作自己专属的词云图(示例)
  15. 在kettle中实现数据验证和检查
  16. 一卡通充值系统c语言,一卡通充值,一卡通充值中心,一卡通充值系统,一卡通充值转账系统 - 新开普(NewCapec)...
  17. Open Sans字体
  18. atheros 9531 uboot spi flash 32m支持
  19. mern技术栈好处?_如何开始使用MERN堆栈
  20. iOS App Security and Analysis: Part 1/2

热门文章

  1. MES系统软件如何在数控加工车间应用?
  2. asp.net高校宿舍后勤管理系统案例
  3. [软件更新]gladder2.0.3.3
  4. 《软件评测师教程》学习笔记-第一章:软件测试概述
  5. fedora 主题美化
  6. 视频教程-DelphiXE10零基础实战快速入门-其他
  7. qpython 3h怎么使用_不思议迷宫M14怎么玩 不思议迷宫M14攻略
  8. Yarn简介及Capacity Fair Scheduler
  9. labview rtm_下载Vista RTM
  10. Codeblocks中的empty project和console application