硬件原理图

 

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 驱动代码相关推荐

  1. AMG8833的使用与stm32驱动代码

    一.介绍 1.内部框图 可以看到AMG8833的内部有红外点阵测温,并且还带有一个热敏电阻.使用同一个ADC进行采样,然后送给Control. 2.器件参数 测温点数:64(8x8的矩阵) 帧率:10 ...

  2. Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...

    linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...

  3. 三星framebuffer驱动代码分析

    一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...

  4. 树莓派IO口驱动代码的编写、微机总线地址、物理地址、虚拟地址、BCM2835芯片手册

    地址总线: 百度百科解释: 地址总线 (Address Bus:又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/ ...

  5. 基于框架编写驱动代码

    操作驱动的上层代码(pin4test) #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> ...

  6. 整合后台服务和驱动代码注入

    整合后台服务和驱动代码注入 Home键的驱动代码: /dev/input/event1: 0001 0066 00000001 /dev/input/event1: 0000 0000 0000000 ...

  7. Linux kernel 中模块化的平台驱动代码介绍

    介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...

  8. 解决一个驱动代码解耦合问题

    之前解决的项目LCD设备兼容问题,在 a.c 文件里面定义了一个变量,然后在 b.c 里面使用 extern声明引用这个变量,通过这种方法可以在b.c中使用在a.c 里面初始化的变量. 但是这中情况就 ...

  9. 蓝桥杯单片机DS1302时钟芯片驱动代码注释

    蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下 /* DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM. 与时钟/RAM 通讯只需要三根线: CE,I/O (数据线) ...

最新文章

  1. 第一阶段个人总结03
  2. 003_JDK的Character类对Comparable接口的实现
  3. 硬件基础知识---(4)电阻的核心参数
  4. mysql修改服务器ip,mysql数据库修改服务器ip
  5. 《机器学习》周志华,勘误修订(带公式显示)
  6. powerpc linux交叉编译器,搭建PowerPC交叉编译器 三
  7. 计算机桌面底部图标一直闪烁,win7系统桌面上的图标一直闪烁怎么办?图标一直闪烁的解决方法...
  8. 【Springboot项目】电信知识库系统
  9. LAME 使用/参数说明, 很好的程序
  10. MC33063电源啸叫
  11. 简易版扫雷(C语言实现)
  12. NLP入门 - 基于Word Embedding + LSTM的古诗生成器
  13. ios native react 闪退_react-native-image-picker闪退的解决办法
  14. [Unity3D] Unity3D连接安卓设备调试unity程序
  15. 毕业设计 基于JSP动漫论坛的设计与实现
  16. JESD22-A120C,2022年最新版发布。用于集成电路的有机材料的水汽扩散率以及水溶解度试验方法
  17. keystone中Vertify operation出现:No handlers could be found for logger keystoneclient.httpclient的问题
  18. 程序人生 - 风冷和水冷散热,怎么选?
  19. 【百科】萨布利亚·坦贝肯
  20. C++描述 LeetCode 26. 删除排序数组中的重复项

热门文章

  1. ERROR 1630 (42000): FUNCTION a.avg does not exist. Check the ‘Function Name Parsing and Resolution‘
  2. 微信小程序——微信开发工具:网络连接失败
  3. Centos7下挂载超过2T以上硬盘
  4. TF卡/SD卡/U盘容量“变小”的问题
  5. java spark的使用和配置
  6. 旅游企业财务管理【2】
  7. c语言中被3除 余数为2,五年级奥数题:带余数除法(B)
  8. 嵌入式学习笔记(1)-Ubuntu基本操作及软件安装
  9. 剑指Offer对答如流系列 - 矩阵中的路径
  10. DDR4硬件原理图设计详解