ADS8328 驱动代码
硬件原理图
ads8328.h
#ifndef __ADS8328_H #define __ADS8328_H #include <stm32f10x.h>#define ADS8328_SPI_CS_PORT GPIOA #define ADS8328_SPI_CS_PIN GPIO_Pin_4 #define ADS8328_SPI_CS_CLK RCC_APB2Periph_GPIOA#define ADS8328_SPI_SCK_PORT GPIOA #define ADS8328_SPI_SCK_PIN GPIO_Pin_5 #define ADS8328_SPI_SCK_CLK RCC_APB2Periph_GPIOA#define ADS8328_SPI_MISO_PORT GPIOA #define ADS8328_SPI_MISO_PIN GPIO_Pin_6 #define ADS8328_SPI_MISO_CLK RCC_APB2Periph_GPIOA#define ADS8328_SPI_MOSI_PORT GPIOA #define ADS8328_SPI_MOSI_PIN GPIO_Pin_7 #define ADS8328_SPI_MOSI_CLK RCC_APB2Periph_GPIOA#define ADS8328_SPI_EOC_PORT GPIOB #define ADS8328_SPI_EOC_PIN GPIO_Pin_0 #define ADS8328_SPI_EOC_CLK RCC_APB2Periph_GPIOA#define ADS8328_SPI_CONVST_PORT GPIOB #define ADS8328_SPI_CONVST_PIN GPIO_Pin_1 #define ADS8328_SPI_CONVST_CLK RCC_APB2Periph_GPIOA// CS #define ADS8328_SPI_CS(status) GPIO_WriteBit(ADS8328_SPI_CS_PORT, ADS8328_SPI_CS_PIN, (BitAction)status) // CLK #define ADS8328_SPI_SCK_HIGH GPIO_SetBits(ADS8328_SPI_SCK_PORT, ADS8328_SPI_SCK_PIN) #define ADS8328_SPI_SCK_LOW GPIO_ResetBits(ADS8328_SPI_SCK_PORT, ADS8328_SPI_SCK_PIN) // MOSI #define ADS8328_SPI_MOSI(status) GPIO_WriteBit(ADS8328_SPI_MOSI_PORT, ADS8328_SPI_MOSI_PIN, (BitAction)status) // MISO #define ADS8328_SPI_MISO_READ GPIO_ReadInputDataBit(ADS8328_SPI_MISO_PORT, ADS8328_SPI_MISO_PIN) // CONVST #define ADS8328_SPI_CONVST(status) GPIO_WriteBit(ADS8328_SPI_CONVST_PORT, ADS8328_SPI_CONVST_PIN, (BitAction)status) //EOC #define ADS8328_SPI_EOC GPIO_ReadInputDataBit(ADS8328_SPI_EOC_PORT,ADS8328_SPI_EOC_PIN)// ADS8327_REGISTER // CMR - Command Reg #define CMD_ADS_SELECT_CH0 0x0000 #define CMD_ADS_SELECT_CH1 0x1000 #define CMD_ADS_WAKEUP 0xB000 #define CMD_ADS_RDCFR 0xC000 #define CMD_ADS_RDDATA 0xD000 #define CMD_ADS_WRCFR 0xE000 #define CMD_ADS_DEFAULT_MODE 0xF000// CFR - Configuration Data Reg D11 - D0 #define CF_CH_SELECT_MODE 0x0800 // 0 手动 1 自动 #define CF_CCLK_SELECT 0x0400 // 0:CCLK = SCLK/2 1:CCLK = Internal OSC #define CF_TRIGGER_SELECT 0x0200 // 0 自动 1 手动--CONVST if(This bit = 0) D4 is ignored#define CF_PA11_POLARITY_SELECT 0x0080 // 0 EOC/INT 高有效 1 低有效 #define CF_PA11_FUNCTION_SELECT 0x0040 // 0 用于INT 1 用于EOC #define CF_PA11_IO_SELECT 0x0020 // 0 PA11用于CDI 使能Chain 1 PA11用于EOC/INT输出 #define CF_AUTO_NAP_POW_DOWN_EN 0x0010 // 0 Enable auto nap power down 1 Disable #define CF_NAP_POW_DOWN_EN 0x0008 // 0 Enable nap power down 1 Disable #define CF_DEEP_POW_DOWN_EN 0x0004 // 0 Enable deep power down 1 Disable #define CF_TAG_EN 0x0002 // 0 失能TAG bit 1 使能 TAG bit output at 17th SCLK #define CF_SYS_RESET 0x0001 // 0 复位 1 正常工作uint8_t ADS8328_SPI_Send4Bits(uint8_t data); unsigned int ADS8328_SPI_Send12Bits(unsigned int byte); unsigned int ADS8328_SPI_Send16Bits(unsigned int data); unsigned int ADS8328_SPI_ReadHalfWord(void);void ADS8328_Read_CFR(unsigned int *data1); void ADS8328_Write_CFR(unsigned int data);unsigned int ADS8328_Read_Data(void);extern void ADC_ADS8328_Init(void);#endif
ads8328.c
#include "ADS8328.h" #include "delay.h"void ADS8328_SPI_GPIO_Config(void) {/* 定义GPIO结构体 */GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;/* 开启GPIO时钟 */RCC_APB2PeriphClockCmd ( ADS8328_SPI_CS_CLK|ADS8328_SPI_SCK_CLK|\ADS8328_SPI_MISO_CLK|\ADS8328_SPI_MOSI_CLK|\ADS8328_SPI_EOC_CLK|\ADS8328_SPI_CONVST_CLK, ENABLE ); // RCC_APB2PeriphClockCmd ( ADS8328_SPI_SCK_CLK, ENABLE ); // RCC_APB2PeriphClockCmd ( ADS8328_SPI_MISO_CLK, ENABLE ); // RCC_APB2PeriphClockCmd ( ADS8328_SPI_MOSI_CLK, ENABLE ); // RCC_APB2PeriphClockCmd ( ADS8328_SPI_EOC_CLK, ENABLE ); // RCC_APB2PeriphClockCmd ( ADS8328_SPI_CONVST_CLK, ENABLE );/* 开启SPI时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 ,ENABLE);/* ADS8328_SPI_CS_PIN引脚初始化,并设置为推挽输出 */GPIO_InitStructure.GPIO_Pin = ADS8328_SPI_CS_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(ADS8328_SPI_CS_PORT, &GPIO_InitStructure);/* ADS8328_SPI_SCK_PIN引脚初始化,并设置为推挽输出 */GPIO_InitStructure.GPIO_Pin = ADS8328_SPI_SCK_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(ADS8328_SPI_SCK_PORT, &GPIO_InitStructure);/* ADS8328_SPI_MOSI_PIN引脚初始化,并设置为推挽输出 */GPIO_InitStructure.GPIO_Pin = ADS8328_SPI_MOSI_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(ADS8328_SPI_MOSI_PORT, &GPIO_InitStructure);/* ADS8328_SPI_MISO_PIN引脚初始化,并设置为浮空输入 */GPIO_InitStructure.GPIO_Pin = ADS8328_SPI_MISO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(ADS8328_SPI_MISO_PORT, &GPIO_InitStructure);/* ADS8328_SPI_CONVST_PIN引脚初始化,并设置为推挽输出 */GPIO_InitStructure.GPIO_Pin = ADS8328_SPI_CONVST_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(ADS8328_SPI_CONVST_PORT, &GPIO_InitStructure);/* ADS8328_SPI_EOC_PIN引脚初始化,并设置为浮空输入 */GPIO_InitStructure.GPIO_Pin = ADS8328_SPI_EOC_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(ADS8328_SPI_EOC_PORT, &GPIO_InitStructure);/* SPI1 configuration */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工模式SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位数据SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据在第一个边沿采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS为软件控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //波特率预分频为4SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1 */SPI_Cmd(SPI1, ENABLE); //开启SPI设备/* ADS8328_SPI_CS_HIGH为高电平 */ADS8328_SPI_CS(1);/* ADS8328_SPI_CONVST_HIGH为高电平 */ADS8328_SPI_CONVST(1);/* 延迟500ms */delay_ms(500);}uint8_t ADS8328_SPI_Send4Bits(uint8_t data) {uint8_t num = 0;int i = 0;data &= 0x0F;for(i=0;i<4;i++){num <<= 1;ADS8328_SPI_SCK_HIGH;if((data & 0x08) >> 3){ADS8328_SPI_MOSI(1);}else{ADS8328_SPI_MOSI(0);}if(ADS8328_SPI_MISO_READ){num++;}delay_us(5);ADS8328_SPI_SCK_LOW;delay_us(5);data <<= 1;}delay_us(5);return(num); }unsigned int ADS8328_SPI_Send16Bits(unsigned int data) {unsigned int num = 0;int i = 16;while(i--){num <<= 1;ADS8328_SPI_SCK_HIGH;if((data & 0x8000) >> 15){ADS8328_SPI_MOSI(1);}else{ADS8328_SPI_MOSI(0);}if(ADS8328_SPI_MISO_READ){num++;}delay_us(5);ADS8328_SPI_SCK_LOW;delay_us(5);data <<= 1;}delay_us(5);return(num); }unsigned int ADS8328_SPI_ReadHalfWord(void) {unsigned int num = 0;int i = 16;while(i--){num <<= 1;ADS8328_SPI_SCK_HIGH;if(ADS8328_SPI_MISO_READ){num++;}ADS8328_SPI_SCK_LOW;}delay_us(5);return(num); }void ADS8328_Write_CFR(unsigned int data) {ADS8328_SPI_CS(0);ADS8328_SPI_Send16Bits(data);ADS8328_SPI_CS(1); }void ADS8328_Read_CFR(unsigned int *data1) {ADS8328_SPI_CS(0);*data1 = ADS8328_SPI_Send16Bits(0xC000)&0x0FFF;ADS8328_SPI_CS(1); }unsigned int ADS8328_Read_Data(void) {unsigned int ret = 0;ADS8328_SPI_CS(0);delay_us(3);ADS8328_SPI_CS(1);while(!ADS8328_SPI_EOC);ADS8328_SPI_CONVST(0);delay_us(1);ADS8328_SPI_CONVST(1);ADS8328_SPI_CS(0);ret = ADS8328_SPI_ReadHalfWord();ADS8328_SPI_CS(1);return ret; }void ADS8328_Init_Config(void) {unsigned int AD_Reg_Rd = 0;ADS8328_SPI_CONVST(0);delay_us(100);ADS8328_SPI_CONVST(1);ADS8328_SPI_CS(0);ADS8328_SPI_Send4Bits(0x0F);ADS8328_SPI_CS(1);delay_us(100);ADS8328_Read_CFR(&AD_Reg_Rd);ADS8328_Write_CFR(0x0EFF);ADS8328_Read_CFR(&AD_Reg_Rd);ADS8328_Write_CFR(0x02FD);ADS8328_Read_CFR(&AD_Reg_Rd);ADS8328_Write_CFR(0x06FF);ADS8328_Read_CFR(&AD_Reg_Rd);ADS8328_Write_CFR(0x02FD);ADS8328_Read_CFR(&AD_Reg_Rd); }void ADS8328_Init(void) {ADS8328_SPI_GPIO_Config();ADS8328_Init_Config(); }
ADS8328 驱动代码相关推荐
- AMG8833的使用与stm32驱动代码
一.介绍 1.内部框图 可以看到AMG8833的内部有红外点阵测温,并且还带有一个热敏电阻.使用同一个ADC进行采样,然后送给Control. 2.器件参数 测温点数:64(8x8的矩阵) 帧率:10 ...
- Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...
linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...
- 三星framebuffer驱动代码分析
一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...
- 树莓派IO口驱动代码的编写、微机总线地址、物理地址、虚拟地址、BCM2835芯片手册
地址总线: 百度百科解释: 地址总线 (Address Bus:又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/ ...
- 基于框架编写驱动代码
操作驱动的上层代码(pin4test) #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> ...
- 整合后台服务和驱动代码注入
整合后台服务和驱动代码注入 Home键的驱动代码: /dev/input/event1: 0001 0066 00000001 /dev/input/event1: 0000 0000 0000000 ...
- Linux kernel 中模块化的平台驱动代码介绍
介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...
- 解决一个驱动代码解耦合问题
之前解决的项目LCD设备兼容问题,在 a.c 文件里面定义了一个变量,然后在 b.c 里面使用 extern声明引用这个变量,通过这种方法可以在b.c中使用在a.c 里面初始化的变量. 但是这中情况就 ...
- 蓝桥杯单片机DS1302时钟芯片驱动代码注释
蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下 /* DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM. 与时钟/RAM 通讯只需要三根线: CE,I/O (数据线) ...
最新文章
- 第一阶段个人总结03
- 003_JDK的Character类对Comparable接口的实现
- 硬件基础知识---(4)电阻的核心参数
- mysql修改服务器ip,mysql数据库修改服务器ip
- 《机器学习》周志华,勘误修订(带公式显示)
- powerpc linux交叉编译器,搭建PowerPC交叉编译器 三
- 计算机桌面底部图标一直闪烁,win7系统桌面上的图标一直闪烁怎么办?图标一直闪烁的解决方法...
- 【Springboot项目】电信知识库系统
- LAME 使用/参数说明, 很好的程序
- MC33063电源啸叫
- 简易版扫雷(C语言实现)
- NLP入门 - 基于Word Embedding + LSTM的古诗生成器
- ios native react 闪退_react-native-image-picker闪退的解决办法
- [Unity3D] Unity3D连接安卓设备调试unity程序
- 毕业设计 基于JSP动漫论坛的设计与实现
- JESD22-A120C,2022年最新版发布。用于集成电路的有机材料的水汽扩散率以及水溶解度试验方法
- keystone中Vertify operation出现:No handlers could be found for logger keystoneclient.httpclient的问题
- 程序人生 - 风冷和水冷散热,怎么选?
- 【百科】萨布利亚·坦贝肯
- C++描述 LeetCode 26. 删除排序数组中的重复项
热门文章
- ERROR 1630 (42000): FUNCTION a.avg does not exist. Check the ‘Function Name Parsing and Resolution‘
- 微信小程序——微信开发工具:网络连接失败
- Centos7下挂载超过2T以上硬盘
- TF卡/SD卡/U盘容量“变小”的问题
- java spark的使用和配置
- 旅游企业财务管理【2】
- c语言中被3除 余数为2,五年级奥数题:带余数除法(B)
- 嵌入式学习笔记(1)-Ubuntu基本操作及软件安装
- 剑指Offer对答如流系列 - 矩阵中的路径
- DDR4硬件原理图设计详解