芯片引脚及功能描述:


驱动代码:
头文件:ads1220.h

#ifndef __ADS1220_H
#define __ADS1220_H#include "em_device.h"
#include "em_gpio.h"
#include "em_cmu.h"#include "em_usart.h"
#include "sl_udelay.h"
#include <math.h>
#include <stdio.h>
#include <string.h>#include "../autogen/sl_spidrv.h"
#include "spidrv.h"
#include "em_assert.h"
#include "sl_spidrv_spiflash_config.h"
#include "sl_spidrv.h"#define    CLK_PERIOD_UNIT                26 // unit: ns#define    MIN_CYCLE_PER_INST        1  // cycle count of one instruction
#define    ONE_LOOP_INIT             10 // instruction count of one loop (estimate)#define    TPUW             10000000       // 10ms#define    ADS1220_FULL_ACCESS_TIME         TPUW / (CLK_PERIOD_UNIT * MIN_CYCLE_PER_INST * ONE_LOOP_INIT)/* Fallback to loc 11 if no location is defined for backwards compatibility */
#ifndef ADS1220_LOC_RX
#define ADS1220_LOC_RX            _USART_ROUTELOC0_RXLOC_LOC11
#endif
#ifndef ADS1220_LOC_SCLK
#define ADS1220_LOC_SCLK          _USART_ROUTELOC0_CLKLOC_LOC11
#endif
#ifndef ADS1220_LOC_TX
#define ADS1220_LOC_TX            _USART_ROUTELOC0_TXLOC_LOC11
#endif
/* Fallback to baudrate of 8 MHz if not defined for backwards compatibility */
#ifndef ADS1220_BAUDRATE
#define ADS1220_BAUDRATE   8000000
#endif#define ADS1220_PORT_DRDY         gpioPortC
#define ADS1220_PIN_DRDY          4#define ADS1220_USART             USART0
#define ADS1220_USART_CLK         cmuClock_USART0#define ADS1220_RESET_COMMAND       0x06
#define ADS1220_START_COMMAND       0x08
#define ADS1220_POWERDOWN_COMMAND   0x02
#define ADS1220_RDATA_COMMAND       0x10
#define ADS1220_RREG_COMMAND        0x20
#define ADS1220_WREG_COMMAND        0x40#define ADS1220_CONFIG_REG0         0x00
#define ADS1220_CONFIG_REG1         0X01
#define ADS1220_CONFIG_REG2         0x02
#define ADS1220_CONFIG_REG3         0x03#define SUCCESS 0
#define ERROR   1#define  lint32_t long int#define CS_SET(status)   {if(status)  GPIO_PinOutSet( SL_SPIDRV_SPIFLASH_CS_PORT, SL_SPIDRV_SPIFLASH_CS_PIN );\else GPIO_PinOutClear( SL_SPIDRV_SPIFLASH_CS_PORT, SL_SPIDRV_SPIFLASH_CS_PIN );}#define CHECK_RETURN_IS_SUCCESS(ret, tips)  if(ret != SUCCESS) \{\printf("[ERROR] %s:%ld\r\n", tips, ret);\return ERROR;\}void ads1220_init(void);
uint32_t ads1220_write_one_byte(unsigned char command);
uint32_t ads1220_read_one_byte( uint8_t *recv_data );
uint32_t ads1220_read_data(lint32_t *result );
uint32_t ads1220_reset(void);
uint32_t ads1220_powerdown(void);
uint32_t ads1220_start_conversion(void);
uint32_t ads1220_read_register(lint32_t *Data);
uint32_t ads1220_write_register(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData);
uint32_t ads1220_connfig(unsigned char channel);
void ads1220_set_channel_PGA(unsigned char channel, unsigned char gain);
uint32_t ads1220_get_adc_value(uint8_t channel, lint32_t *voltage);
void clk_delay(uint16_t delay_time );
void ads1220_test_process(void);
void ads1220_printf_channel_vol(uint8_t test_num, uint8_t channel);
#endif

源文件:ads1220.c

#include "ads1220.h"unsigned char channel0[8] = {};
unsigned char channel1[8] = {};
unsigned char Init_Config[8] = {};void ads1220_init( void )
{CMU_ClockEnable( cmuClock_GPIO, true );GPIO_PinModeSet( SL_SPIDRV_SPIFLASH_CS_PORT,   SL_SPIDRV_SPIFLASH_CS_PIN,   gpioModePushPull, 1 );GPIO_PinModeSet( ADS1220_PORT_DRDY,   ADS1220_PIN_DRDY, gpioModeInput, 0 );
}uint32_t ads1220_write_one_byte( uint8_t byte_value)
{uint32_t ret = SPIDRV_MTransmitB(sl_spidrv_spiflash_handle, &byte_value, 1);CHECK_RETURN_IS_SUCCESS(ret, "SPIDRV_MTransmitB error! Error code");return SUCCESS;
}uint32_t ads1220_read_one_byte( uint8_t *recv_data )
{uint32_t ret = 1;ret = SPIDRV_MReceiveB( sl_spidrv_spiflash_handle, recv_data, 1 );CHECK_RETURN_IS_SUCCESS(ret, "SPIDRV_MReceiveB error! Error code");return SUCCESS;
}uint32_t ads1220_read_data(lint32_t *result )
{uint32_t ret = 1;unsigned char recv_buf = 0;CS_SET(0);ret = ads1220_write_one_byte(ADS1220_RDATA_COMMAND);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");while(GPIO_PinInGet(ADS1220_PORT_DRDY, ADS1220_PIN_DRDY));ret = ads1220_read_one_byte(&recv_buf);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_one_byte error! Error code");*result = recv_buf;ret = ads1220_read_one_byte( &recv_buf);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_one_byte error! Error code");*result = (*result << 8)|recv_buf;ret = ads1220_read_one_byte( &recv_buf);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_one_byte error! Error code");*result = (*result << 8)|recv_buf;CS_SET(1);
//    printf("result = 0x%0lx   %ld\r\n", *result, *result);if (*result & 0x800000){*result |= 0xff000000;printf("result |= 0xff000000");}return SUCCESS;
}uint32_t ads1220_reset(void)
{uint32_t ret = 1;CS_SET(0);clk_delay(40);ret = ads1220_write_one_byte(ADS1220_RESET_COMMAND);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");clk_delay(40);CS_SET(1);clk_delay(40);return SUCCESS;
}uint32_t ads1220_powerdown(void)
{uint32_t ret = 1;CS_SET(0);clk_delay(40);ret = ads1220_write_one_byte(ADS1220_POWERDOWN_COMMAND);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");clk_delay(40);CS_SET(1);clk_delay(40);return SUCCESS;
}uint32_t ads1220_start_conversion(void)
{uint32_t ret = 1;CS_SET(0);clk_delay(80);ret = ads1220_write_one_byte(ADS1220_START_COMMAND);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");clk_delay(80);CS_SET(1);clk_delay(80);return SUCCESS;
}uint32_t ads1220_read_register(lint32_t *Data)
{uint32_t ret = 1;unsigned char recv_buf = 0;CS_SET(0);clk_delay(80);ret = ads1220_write_one_byte(ADS1220_RREG_COMMAND|0x03);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");ret = ads1220_read_one_byte( &recv_buf);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_one_byte error! Error code");*Data = recv_buf;ret = ads1220_read_one_byte(&recv_buf);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_one_byte error! Error code");*Data =  (*Data << 8)|recv_buf;ret = ads1220_read_one_byte( &recv_buf);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_one_byte error! Error code");*Data = (*Data << 8)|recv_buf;ret = ads1220_read_one_byte(&recv_buf);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_one_byte error! Error code");*Data = (*Data << 8)|recv_buf;CS_SET(1);clk_delay(80);return SUCCESS;
}uint32_t ads1220_write_register(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)
{unsigned char i;uint32_t ret = 1;CS_SET(0);clk_delay(80);// send the command byteret = ads1220_write_one_byte(ADS1220_WREG_COMMAND | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");// send the data bytesfor (i=0; i< NumRegs; i++){ret = ads1220_write_one_byte(*pData);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");pData++;}CS_SET(1);return SUCCESS;
}/** 函数说明:ads1220设置配置寄存器,包括多路复用选择、增益配置、数据速率*          工作模式、转换模式、基准电压选择等设置* 参数:channel  通道选择   1-3可选* 返回值:设置成功返回SUCCESS,失败返回ERROR** */
uint32_t ads1220_config(unsigned char channel) // 0-1-2-3
{uint32_t ret = 1;lint32_t data = 0;switch(channel){case 0: Init_Config[0] = 0x81;break;case 1: Init_Config[0] = 0x91;break;case 2: Init_Config[0] = 0xA1;break;case 3: Init_Config[0] = 0xB1;break;}Init_Config[1] = 0X40;//90SPSInit_Config[2] = 0X10; /* 同时抑制50Hz和60Hz IDAC电流关断 */Init_Config[3] = 0X00;ret = ads1220_write_register(ADS1220_CONFIG_REG0,0x04,Init_Config);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_write_one_byte error! Error code");ret = ads1220_read_register(&data);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_register error! Error code");return SUCCESS;
}void ads1220_set_channel_PGA(unsigned char channel, unsigned char gain)
{switch(channel){case 0:if(gain==1)channel0[0] = 0x81;if(gain==2)channel0[1] = 0x83;if(gain==4)channel0[2] = 0x85;if(gain==8)channel0[3] = 0x87;if(gain==16)channel0[4] = 0x89;if(gain==32)channel0[5] = 0x8B;if(gain==64)channel0[6] = 0x8D;if(gain==128)channel0[7] = 0x8F;break;case 1:if(gain==1)channel1[0] = 0x91;if(gain==2)channel1[1] = 0x93;if(gain==4)channel1[2] = 0x95;if(gain==8)channel1[3] = 0x97;if(gain==16)channel1[4] = 0x99;if(gain==32)channel1[5] = 0x9B;if(gain==64)channel1[6] = 0x9D;if(gain==128)channel0[7] = 0x9F;break;case 2: Init_Config[0] = 0xA1;break;case 3: Init_Config[0] = 0xB1;break;}
}uint32_t ads1220_get_adc_value(uint8_t channel, lint32_t *voltage) // 0-1-2-3
{uint32_t ret = 1;ret = ads1220_config(channel);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_config error! Error code");ret = ads1220_start_conversion();CHECK_RETURN_IS_SUCCESS(ret, "ads1220_start_conversion error! Error code");ret = ads1220_read_data(voltage);CHECK_RETURN_IS_SUCCESS(ret, "ads1220_read_data error! Error code");return SUCCESS;
}void clk_delay(uint16_t delay_time )
{//  delay_time = delay_time*2;while( delay_time>0 ){delay_time--;}
}void ads1220_printf_channel_vol(uint8_t test_num, uint8_t channel)
{lint32_t adc_value = 0;uint32_t ret = 1;double res_value = 0.0;char vol_buf[50] = {0};ret = ads1220_get_adc_value(1, &adc_value);if(ret != SUCCESS){printf("[ERROR] ads1220_get_adc_value error! Error code %ld\r\n", ret);return;}res_value = 100/(2.048/8388608*adc_value-1.25);sprintf(vol_buf, "test num: %d   channel: %d  res: %dK\r\n", test_num, channel ,(int)res_value);printf("%s", vol_buf);
}void ads1220_test_process(void)
{lint32_t adc_value = 0;uint32_t ret = 1;double vol_value = 0.0;char vol_buf[20] = {0};ret = ads1220_get_adc_value(0, &adc_value);if(ret != SUCCESS){printf("[ERROR] ads1220_get_adc_value error! Error code %ld\r\n", ret);return;}vol_value = 2.048/8388608*adc_value;sprintf(vol_buf, "AIN0 vol: %lf\r\n", vol_value);printf("%s", vol_buf);ret = ads1220_get_adc_value(1, &adc_value);if(ret != SUCCESS){printf("[ERROR] ads1220_get_adc_value error! Error code %ld\r\n", ret);return;}vol_value = 2.048/8388608*adc_value;sprintf(vol_buf, "AIN1 vol: %lf\r\n\r\n", vol_value);printf("%s", vol_buf);sl_udelay_wait(1000000);
}

注:
ads1220为SPI驱动,仅支持SPI模式1(CPOL = 0 CPHA = 1)
上述代码可直接运行在芯科科技的EFR32BG22中
需要移植到自己的芯片中需要替换掉对应的部分(gpio驱动;延时;如果使用硬件spi还需要适配对应的硬件spi驱动)。

ADS1220 24位高精度ADC芯片驱动相关推荐

  1. 驱动编程简单教程——PTC512(ADC芯片驱动)为例

    1.简介 上几周硬件找了一个ADC芯片的替代料,需要我这边写一个驱动做测试.以前都是配置与修改设备树,最多查看或小改一下驱动,没有写过驱动,所有记录一下思路.大致思路就是先看原理图,再看芯片手册,知道 ...

  2. AD7760转换原理及采集程序设计 (24位Σ-Δ型ADC)

    1 AD7760(Σ-Δ模数转换器) 1.1 Σ-Δ型ADC的工作原理 的ADC不同,Σ-Δ型ADC不是直接根据采样数据的每一个样值的大小进行量化编码,而是根据前一量值与后一量值的差值即所谓的增量的大 ...

  3. 电压信号采集部分,24位高精度模数转换芯片实现

    电压信号采集部分 电压信号采集是对实验数据的直接获取,其采集精度决定了实验的精度.接地网阻值比较小,属于毫欧数量级,注入电流为1A时,所需采集的电压信号是毫伏数量级.所以电压信号采集需要较高的稳定性和 ...

  4. CS4344 MS5344国产替代DP7344192K 双通道24 位DA 转换器芯片

    产品概述 DP7344 是一款完整的2 通道输出数模转换芯片, 内含插值滤波器.Multi-Bit 数模转换器.输出模拟滤波器,并支持大部分的音频数据格式.DP7344 基于一个带线性模拟低通滤波器的 ...

  5. CS4361国产替代DP7361 192K 六通道24 位DA 转换器芯片

    DP7361 是一款立体声六通道线性输出的数模转换器,内含插值滤波器.Multi-Bit 数模转换 器.模拟输出滤波器,支持主流的音频数据格式. DP7361 片上集成线性低通模拟滤波器和四阶Mult ...

  6. 专用型高精度24位AD转换器芯片HX711说明

  7. Linux驱动开发-编写PCF8591(ADC)芯片驱动

    1. PCF8591介绍 PCF8591是一个IIC总线接口的ADC/DAC转换芯片,功能比较强大,这篇文章就介绍在Linux系统里如何编写一个PCF8591的驱动,完成ADC数据采集,DAC数据输出 ...

  8. STM32F030 12位高精度ADC用法

    STM32F030C8有一个12位ADC接口,现用库函数编写ADC驱动代码 1.初始化接口,配置ADC参数通道 void bsp_adc_init(void) {     ADC_InitTypeDe ...

  9. 热电偶温度采集pid加热控制,高精度adc数据采集继电器输出

    热电偶温度采集pid加热控制,高精度adc数据采集继电器输出 整套系统包括: 2路adc数据采集系统,采用24位高精度adc(美国adi公司产品ad7732),分辨率达到0.0002mv,可做高精度数 ...

最新文章

  1. android 汉字编码,Android解压中文乱码
  2. MFC CListCtrl控件基本使用图解
  3. ABAP知识:LIKE LINE OF 和LIKE TABLE OF
  4. pixhawk position_estimator_inav.cpp思路整理及数据流
  5. ext.ajax.request跨域,跨域Ajax访问header中 x-requested-with丢失
  6. QT跨平台项目开发经验(项目打包)
  7. python3转码python2_python2写的代码移植到python3后无法转码成中文文本,请大神指教,谢谢~...
  8. 三步法助你快速定位网站性能问题
  9. Pandas timedelta_range
  10. 0606-工厂模式、单例模式、DBDA的单例和完整功能
  11. Beego框架简介准备搭建分布式爬虫
  12. 代理服务器反向代理varnish配置文件解析
  13. linux 系统命令和方法
  14. 皇冠与锚-JS实现(拒绝赌博)
  15. 马克飞象自定义渲染CSS配置
  16. 华为西安鲲鹏服务器项目,眼见为实,华为鲲鹏架构服务器生态大揭秘
  17. php 怎么打开一个pdf,pdf是什么?用什么打开?
  18. 憨批的语义分割重制版7——Tensorflow2 搭建自己的Unet语义分割平台
  19. 5G/4G外置型无线通信模块
  20. Preface---ITE EC

热门文章

  1. 第二类曲面积分、场论、高斯公式和斯托克斯公式
  2. java可以开发安卓app吗,Java开发者必看
  3. 《研磨设计模式》 与 《设计模式之禅》对比
  4. 用m ip衡量的计算机性能指标是,ip网络技术要求网络性能参数与指标.pdf.pdf
  5. [SMOJ2116]诺诺的队列
  6. CAD高版本窗体阵列LISP_如何把CAD高版本阵列对话框在低版本调出来? _ 一堂课...
  7. 利用Jsoup爬取网页内容
  8. 手把手教你使用R语言做出SCI论文中的表二(单因素分析表)(3)
  9. 大数据清洗与预算第三章
  10. 【群晖NAS】真·免费内网穿透方案 及踩坑合集