//-----------------------------------------------------------------
// 程序描述:
// 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
//-----------------------------------------------------------------
具体工程参见主页