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; //波特率预分频为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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值