ADS8688 STM32F407 HAL库 SPI驱动

//-----------------------------------------------------------------
// 程序描述:
//     ADS8688驱动程序   
//-----------------------------------------------------------------

//-----------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------
#include "ads8688.h"
#include "delay.h"
#include "spi.h"	
//-----------------------------------------------------------------

//-----------------------------------------------------------------
// void GPIO_ADS8688_Configuration(void)
//-----------------------------------------------------------------
// 
// 函数功能: ADS8688引脚配置函数
// 入口参数: 无 
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
void GPIO_ADS8688_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
	
	GPIO_InitStructure.Pin = GPIO_PIN_4;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.Pin = GPIO_PIN_4 | GPIO_PIN_5;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
}

//-----------------------------------------------------------------
// void ADS8688_Init(void)
//-----------------------------------------------------------------
// 
// 函数功能: ADS8361初始化
// 入口参数: 无 
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
void ADS8688_Init(void)
{
	RST_L;
	delay_us(2);
	RST_H;
	DAISY_L;

	ADS8688_Write_Command(RST);	// 软件复位模式
	delay_us(2);
	ADS8688_Write_Program(CH0_INPUT_RANGE, VREF_B_125);	// 通道0的输入范围为±5.12V
	ADS8688_Write_Program(CH1_INPUT_RANGE, VREF_B_125);	// 通道1的输入范围为±5.12V
	ADS8688_Write_Program(CH2_INPUT_RANGE, VREF_B_125);	// 通道2的输入范围为±5.12V
	ADS8688_Write_Program(CH3_INPUT_RANGE, VREF_B_125);	// 通道3的输入范围为±5.12V
	ADS8688_Write_Program(CH4_INPUT_RANGE, VREF_B_125);	// 通道4的输入范围为±5.12V
	ADS8688_Write_Program(CH5_INPUT_RANGE, VREF_B_125);	// 通道5的输入范围为±5.12V
	ADS8688_Write_Program(CH6_INPUT_RANGE, VREF_B_125);	// 通道6的输入范围为±5.12V
	ADS8688_Write_Program(CH7_INPUT_RANGE, VREF_B_125);	// 通道7的输入范围为±5.12V
	ADS8688_Write_Program(CH_PWR_DN, 0xFD);				// 该寄存器的默认值为 00h,这意味着在默认情况下所有通道均已上电,并且能够被包含在 AUTO_RST 序列中
	ADS8688_Write_Program(AUTO_SEQ_EN, 0x02);			//该寄存器的默认值为 FFh,这意味着在默认情况下,所有通道都包含在自动扫描序列中
	ADS8688_Write_Command(MAN_CH_1);
//	ADS8688_Write_Command(AUTO_RST);
}

//-----------------------------------------------------------------
// void ADS8361_Write_Command(uint16_t com)
//-----------------------------------------------------------------
// 
// 函数功能: 写命令
// 入口参数: com:命令
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
void ADS8688_Write_Command(uint16_t com)
{
	uint8_t wr_data[2] = {0x00, 0x00};
	
	wr_data[0] = (uint8_t)(com >> 8);
	wr_data[1] = (uint8_t)(com &0x00FF);
	
	CS_L;
	HAL_SPI_Transmit(&hspi1, wr_data, 2, 0xFFFF);
	CS_H;
}

//-----------------------------------------------------------------
// void ADS8688_Write_Program(uint8_t addr, uint8_t data)
//-----------------------------------------------------------------
// 
// 函数功能: 写程序寄存器
// 入口参数: addr: 寄存器地址
//					 data:数据
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
void ADS8688_Write_Program(uint8_t addr, uint8_t data)
{
	uint8_t wr_data[2] = {0x00, 0x00};
	
	wr_data[0] = (addr << 1) | 0x01;
	wr_data[1] = data;
	
	CS_L;
	HAL_SPI_Transmit(&hspi1, wr_data, 2, 0xFFFF);
	CS_H;
}

//-----------------------------------------------------------------
// uint8_t ADS8361_Read_Program(uint8_t addr)
//-----------------------------------------------------------------
// 
// 函数功能: 读程序寄存器
// 入口参数: addr: 寄存器地址
// 返 回 值: 读取的数据
// 注意事项: 无
//
//-----------------------------------------------------------------
uint8_t ADS8688_Read_Program(uint8_t addr)
{
	uint8_t Rxdata;
	uint8_t wr_data[2] = {0x00, 0x00};
	
	wr_data[0] = addr << 1;
	
	CS_L;
	HAL_SPI_Transmit(&hspi1, wr_data, 2, 0xFFFF);
	HAL_SPI_Receive(&hspi1, &Rxdata, 1, 0xFFFF);
	CS_H;
	
	return Rxdata;
}

//-----------------------------------------------------------------
// void Get_AUTO_RST_Mode_ADC_Data(uint8_t ch_num, uint16_t *data)
//-----------------------------------------------------------------
// 
// 函数功能: 读取AUTO_RST模式下的输出数据
// 入口参数: ch_num:通道数量(与AUTO_SEQ_EN设置的参数有关)
//					 *data:读取得到的数据
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
void Get_AUTO_RST_Mode_ADC_Data(uint8_t ch_num, uint16_t *data)
{
	uint8_t Rxdata[4],i;
	uint8_t wr_data[4] = {0x00, 0x00, 0x00, 0x00};
	
	
	for(i=0; i<ch_num; i++) 
	{
		CS_L;
		HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)wr_data, (uint8_t *)Rxdata, 4, 0xFFFF);
		CS_H;
		*(data+i) = ((uint16_t)Rxdata[2] << 8) | Rxdata[3];
	}
}

//-----------------------------------------------------------------
// void Get_MAN_CH_Data(uint16_t ch, uint16_t *data)
//-----------------------------------------------------------------
// 
// 函数功能: 读取AUTO_RST模式下的输出数据
// 入口参数: ch_num:通道数量(与AUTO_SEQ_EN设置的参数有关)
//					 *data:读取得到的数据
// 返 回 值: 无
// 注意事项: 无
//
//-----------------------------------------------------------------
void Get_MAN_CH_Data(uint16_t ch, uint16_t *data)
{
	uint8_t Rxdata[4];
	uint8_t wr_data[4] = {0x00, 0x00, 0x00, 0x00};

	ADS8688_Write_Command(ch);
	__NOP();
	__NOP();
	CS_L;
	HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)wr_data, (uint8_t *)Rxdata, 4, 0xFFFF);
	CS_H;
	*data = ((uint16_t)Rxdata[2] << 8) | Rxdata[3];
}
//-----------------------------------------------------------------
// 程序描述:
//     ADS8688驱动程序
//-----------------------------------------------------------------
#ifndef _ADS8688_H
#define _ADS8688_H

#include "main.h"
//-----------------------------------------------------------------
// 宏定义
//-----------------------------------------------------------------
// 命令寄存器
#define NO_OP					0x0000	// 继续操作
#define STDBY					0x8200	// 进入待机状态
#define PWR_DN				0x8300	// 设备断电
#define RST						0x8500	// 复位
#define AUTO_RST			0xA000	// 重启后启动自动模式
#define MAN_CH_0			0xC000	// 选择通道0输入
#define MAN_CH_1			0xC400	// 选择通道1输入
#define MAN_CH_2			0xC800	// 选择通道2输入
#define MAN_CH_3			0xCC00	// 选择通道3输入
#define MAN_CH_4			0xD000	// 选择通道4输入
#define MAN_CH_5			0xD400	// 选择通道5输入
#define MAN_CH_6			0xD800	// 选择通道6输入
#define MAN_CH_7			0xDC00	// 选择通道7输入
#define MAN_AUX				0xE000	// 选择通道AUX输入

// 程序寄存器
#define AUTO_SEQ_EN							0x01	// 自动扫描排序控制寄存器
#define CH_PWR_DN			 					0x02	// 通道掉电寄存器
#define FEATURE_SELECT 					0x03	// 器件特性选择控制寄存器
#define CH0_INPUT_RANGE 				0x05	// 通道0输入范围选择寄存器
#define CH1_INPUT_RANGE 				0x06	// 通道1输入范围选择寄存器
#define CH2_INPUT_RANGE 				0x07	// 通道2输入范围选择寄存器
#define CH3_INPUT_RANGE 				0x08	// 通道3输入范围选择寄存器
#define CH4_INPUT_RANGE 				0x09	// 通道4输入范围选择寄存器
#define CH5_INPUT_RANGE 				0x0A	// 通道5输入范围选择寄存器
#define CH6_INPUT_RANGE 				0x0B	// 通道6输入范围选择寄存器
#define CH7_INPUT_RANGE 				0x0C	// 通道7输入范围选择寄存器
#define CH0_HYSTERESIS 					0x15	//
#define CH0_HIGH_THRESHOLD_MSB 	0x16	//
#define CH0_HIGH_THRESHOLD_LSB 	0x17	//
#define CH0_LOW_THRESHOLD_MSB 	0x18	//
#define CH0_LOW_THRESHOLD_LSB 	0x19	//
#define CH7_HYSTERESIS 					0x38	//
#define CH7_HIGH_THRESHOLD_MSB 	0x39	//
#define CH7_HIGH_THRESHOLD_LSB 	0x3A	//
#define CH7_LOW_THRESHOLD_MSB 	0x3B	//
#define CH7_LOW_THRESHOLD_LSB 	0x3C	//
#define COMMAND_READ_BACK 			0x3F	// 命令回读寄存器,只读

// 输入范围(VREF = 4.096V)
#define VREF_B_25								0x00	// 通道输入范围±2.5*VREF
#define VREF_B_125							0x01	// 通道输入范围±1.25*VREF
#define VREF_B_0625							0x02	// 通道输入范围±0.625*VREF
#define VREF_U_25								0x05	// 通道输入范围2.5*VREF
#define VREF_U_125							0x06	// 通道输入范围1.25*VREF

//-----------------------------------------------------------------
// 引脚配置
//-----------------------------------------------------------------
#define RST_L 	 		  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,  GPIO_PIN_RESET)
#define RST_H 	 		  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,  GPIO_PIN_SET)
#define DAISY_L 	 		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET)
#define DAISY_H 	 		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET)
#define CS_L 	 		  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define CS_H 	 		  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)


//-----------------------------------------------------------------
// 外部函数声明
//-----------------------------------------------------------------
extern void GPIO_ADS8688_Configuration(void);
extern void ADS8688_Init(void);
extern void ADS8688_Write_Command(uint16_t com);
extern void ADS8688_Write_Program(uint8_t addr, uint8_t data);
extern uint8_t ADS8688_Read_Program(uint8_t addr);
extern void Get_AUTO_RST_Mode_ADC_Data(uint8_t ch_num, uint16_t *data);
extern void Get_MAN_CH_Data(uint16_t ch, uint16_t *data);

#endif
//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------

具体工程参见主页

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值