AD7124驱动代码(基于GD32F103 SPI)
接线
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)相关推荐
- FPGA Verilog AD7606驱动代码,包含SPI模式读取和并行模式读取两种
FPGA Verilog AD7606驱动代码,包含SPI模式读取和并行模式读取两种,代码注释详细 编号:7428665912784264白衫如初oh
- MS5611大气压强传感器驱动代码(基于GD32F103)
ms5611驱动代码.c #include "main.h"stru_MS5611_DATA MS5611_DATA={0};const uint8_t ms5611_reset_ ...
- SHT31/85温湿度传感器驱动代码(基于GD32F103)
IIC驱动.c部分 #include "main.h" void IIC_SDA(uint8_t status) {if(status == 1){gpio_bit_set(SDA ...
- HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库
HIH8121温湿度传感器代码基于STM32 HAL库 HIH8121传感器简介 驱动代码.c 驱动代码.h main函数 HIH8121传感器简介 HIH8121是霍尼韦尔公司生产的测量温湿度参数一 ...
- STM32之 W25Q128闪存(SPI协议)驱动代码(程序稳定,清晰明了)
第一部分:W25Q128代码头文件 (W25Q128.h) #ifndef W25Q128_H #define W25Q128_H #include "stm32f10x.h" # ...
- 基于驱动框架编写驱动代码
前言:基于上一个博文对 linux驱动的认知的了解,那么现在开始我们正式来进入学习基于驱动框架来编写驱动代码,那么接下来我们先来看看一个最简单的驱动框架代码 一.字符设备驱动框架代码与应用层代码 驱动 ...
- 基于STM32F103的步进电机(ULN2003/28BYJ-48)角度和转速控制详细资料和驱动代码
基于STM32F103的步进电机(ULN2003/28BYJ-48)角度和转速控制详细资料和驱动代码 详细资料 1.技术参数 参数 值 参数 值 电压VDC 12 空载牵入频率 Hz ≥500 直流电 ...
- 基于Sata3.0固态硬盘接口协议verilog驱动代码
基于Sata3.0固态硬盘接口协议verilog驱动代码 Verilog程序源代码. vivado2017.4开发. 可自适应3.0,2.0速率, 可扩展也磁盘矩阵,支持不同数据包读写 带有测速功能, ...
- 基于STM32的LTC6804驱动代码解析
在上次项目中用到了LTC6804这块片子,初次使用它的采集精度确实令我惊讶到了,设备用于监测2V的铅酸电池组,硬件上几乎没有加任何滤波,直接读取数据就能达到3mv以下的精度,片子真的很好用. 下面总结 ...
- 【STM32】基于STM32CubeIDE SPI+DMA驱动WS2812
[STM32]基于STM32CubeIDE SPI+DMA驱动WS2812 ✨申明:本文章仅发表在CSDN网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创!
最新文章
- 发际线有救了!这款app可一键AI生发,拯救你的自拍焦虑
- jquery初始化的三种方式
- 服务机器人---充电桩
- 恒丰银行深夜紧急澄清!“我行与建设银行的报道严重不实”!恒丰银行称目前自身经营稳定有序
- php下intval()和(int)转换使用与区别
- 酒鬼随机漫步(一个矢量类)
- SpringBoot入门之内嵌Tomcat配置
- 用于科研的移动机器人平台推荐
- C#中几种数据库的大数据批量插入
- 【LeetCode笔记】301. 删除无效的括号(Java、DFS、字符串)
- eclipse中JS文件乱码
- ECMAScript 的发展历史
- 原创 leetcode/力扣 背包问题大总结,BAT程序员完整学习手册PDF开放下载!
- echarts词云图实现_系统讲解如何用Python制作自己专属的词云图(示例)
- 在kettle中实现数据验证和检查
- 一卡通充值系统c语言,一卡通充值,一卡通充值中心,一卡通充值系统,一卡通充值转账系统 - 新开普(NewCapec)...
- Open Sans字体
- atheros 9531 uboot spi flash 32m支持
- mern技术栈好处?_如何开始使用MERN堆栈
- iOS App Security and Analysis: Part 1/2
热门文章
- MES系统软件如何在数控加工车间应用?
- asp.net高校宿舍后勤管理系统案例
- [软件更新]gladder2.0.3.3
- 《软件评测师教程》学习笔记-第一章:软件测试概述
- fedora 主题美化
- 视频教程-DelphiXE10零基础实战快速入门-其他
- qpython 3h怎么使用_不思议迷宫M14怎么玩 不思议迷宫M14攻略
- Yarn简介及Capacity Fair Scheduler
- labview rtm_下载Vista RTM
- Codeblocks中的empty project和console application