接线
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(); //复位AD7124
AD7124_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_0
AD7124_SendByte(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换
AD7124_SendByte(0x91);//AIN4 AVss
AD7124_SendByte(0x0A);//写入通道寄存器0 CHANNEL_1
AD7124_SendByte(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换
AD7124_SendByte(0xB1);//AIN5 AVss
AD7124_SendByte(0x0B);//写入通道寄存器0 CHANNEL_2
AD7124_SendByte(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换
AD7124_SendByte(0x85);//AIN4 AIN5
AD7124_SendByte(0x19);//写入配置寄存器0 CONFIG_0
AD7124_SendByte(0x09);//选择双极型模式、关闭检测电流源、使能AIN BUF
AD7124_SendByte(0x70);//选择neibu基准源,增益配置为+-1.25V
AD7124_SendByte(0x1A);//写入配置寄存器0 CONFIG_1
AD7124_SendByte(0x09);//选择双极型模式、关闭检测电流源、使能REF BUF与AIN BUF,选择neibu基准源,增益配置为+-2.5V;
AD7124_SendByte(0x70);//1倍增益 使能AIN BUF
AD7124_SendByte(0x1B);//写入配置寄存器0 CONFIG_2
AD7124_SendByte(0x09);//选择双极型模式、关闭检测电流源、使能REF BUF与AIN BUF,选择neibu基准源,增益配置为+-2.5V;
AD7124_SendByte(0x70);//1倍增益 使能AIN BUF
AD7124_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);
}
}