AD7124驱动代码(基于GD32F103 SPI)

接线

AD7124部分

AD7124-4

单片机部分

SPI
在这里插入图片描述

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);
  }
}
  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值