硬件原理图
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; //波特率预分频为4 SPI_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(); }
04-21
3967
08-28
184
05-12