前言
SPI设备如果不挂多机通讯的话真的是太遗憾了
ADS = new_ADS_Driver(0, SPIx, GPIOx, GPIO_PIN_x);//完成初始化
value = ADS->read(ADS, 0);//读取数据
需要先挂这个库
工程文件参考——CubeMX+LL库+SPI主机 阻塞式通用库
实现也是参考别人做的,不过优化了库,可以支持多机直接挂载
ADS1118驱动实现
ads_driver.h
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __ADS_DRIVER_H
#define __ADS_DRIVER_H
/* =================================================================================
File name: __ADS_DRIVER_H
Author: Mr.NoFish
===================================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "spi_driver.h"
//端口定义
#define CONFIG_VALUE 0X408B //AIN0-AIN1 4.096 128sps pull on DOUT
//单次转换开始
#define ADS1118_CONFIG_SS_START_MASK 0x8000
#define ADS1118_CONFIG_SS_START_ON 0x8000 //开始单次转换
#define ADS1118_CONFIG_SS_START_OFF 0x0000 //无效
//输入多路复用器配置
#define ADS1118_CONFIG_MUX_MASK 0x7000
#define ADS1118_CONFIG_MUX_DIFF_0_1 0x0000 //AINP is AIN0 and AINN is AIN1//差分
#define ADS1118_CONFIG_MUX_DIFF_0_3 0x1000 //AINP is AIN0 and AINN is AIN3
#define ADS1118_CONFIG_MUX_DIFF_1_3 0x2000 //AINP is AIN1 and AINN is AIN3
#define ADS1118_CONFIG_MUX_DIFF_2_3 0x3000 //AINP is AIN2 and AINN is AIN3
#define ADS1118_CONFIG_MUX_SINGLE_0 0x4000 //AINP is AIN0 and AINN is GND//单端
#define ADS1118_CONFIG_MUX_SINGLE_1 0x5000 //AINP is AIN1 and AINN is GND
#define ADS1118_CONFIG_MUX_SINGLE_2 0x6000 //AINP is AIN2 and AINN is GND
#define ADS1118_CONFIG_MUX_SINGLE_3 0x7000 //AINP is AIN3 and AINN is GND
//可编程增益放大器配置
#define ADS1118_CONFIG_PGA_MASK 0x0E00 //FSR is ±0.256 V
#define ADS1118_CONFIG_PGA_6_144V 0x0000 //FSR is ±6.144 V
#define ADS1118_CONFIG_PGA_4_096V 0x0200 //FSR is ±4.096 V
#define ADS1118_CONFIG_PGA_2_048V 0x0400 //FSR is ±2.048 V
#define ADS1118_CONFIG_PGA_1_024V 0x0600 //FSR is ±1.024 V
#define ADS1118_CONFIG_PGA_0_512V 0x0800 //FSR is ±0.512 V
#define ADS1118_CONFIG_PGA_0_256V 0x0A00 //FSR is ±0.256 V
//设备操作模式
#define ADS1118_CONFIG_MODE_MASK 0x0100
#define ADS1118_CONFIG_MODE_CONTIN 0x0000 //连续转换模式
#define ADS1118_CONFIG_MODE_SINGLE 0x0100 //掉电,单次转换模式
//数据速率
#define ADS1118_CONFIG_DR_MASK 0x00E0 //860SPS
#define ADS1118_CONFIG_DR_8SPS 0x0000
#define ADS1118_CONFIG_DR_16SPS 0x0020
#define ADS1118_CONFIG_DR_32SPS 0x0040
#define ADS1118_CONFIG_DR_64SPS 0x0060
#define ADS1118_CONFIG_DR_128SPS 0x0080
#define ADS1118_CONFIG_DR_250SPS 0x00A0
#define ADS1118_CONFIG_DR_475SPS 0x00C0
#define ADS1118_CONFIG_DR_860SPS 0x00E0
//温度传感器模式
#define ADS1118_CONFIG_TS_MODE_MASK 0x0010
#define ADS1118_CONFIG_TS_MODE_ADC 0x0000 //ADC模式
#define ADS1118_CONFIG_TS_MODE_TEMP 0x0010 //温度传感器模式
//上拉使能
//仅当CS为高电平时,此位使能DOUT / DRDY引脚上的内部弱上拉电阻。 启用后,内部400kΩ电阻器将总线线路连接到电源。 禁用时,DOUT / DRDY引脚悬空。
#define ADS1118_CONFIG_PULL_UP_MASK 0x0008
#define ADS1118_CONFIG_PULL_UP_ON 0x0008 //上拉电阻启用
#define ADS1118_CONFIG_PULL_UP_OFF 0x0000 //上拉电阻禁用
//控制是否将数据写入配置寄存器
#define ADS1118_CONFIG_NOP_MASK 0x0006
#define ADS1118_CONFIG_NOP_VALID 0x0002 // 有效数据,更新Config寄存器
#define ADS1118_CONFIG_NOP_INVALID 0x0006 //无效数据,不更新Config寄存器的内容
//
#define ADS1118_CONFIG_RESV 0x0001 // default, required
//
#define ADS1118_CONST_C_PER_BIT (0.03125)
#define ADS1118_CONST_BIT_PER_C 32
//
#define ADS1118_CONST_6_144V_LSB_mV (0.1875)
#define ADS1118_CONST_4_096V_LSB_mV (0.125)
#define ADS1118_CONST_2_048V_LSB_mV (0.0625)
#define ADS1118_CONST_1_024V_LSB_mV (0.03125)
#define ADS1118_CONST_0_512V_LSB_mV (0.015625)
#define ADS1118_CONST_0_256V_LSB_mV (0.0078125)
typedef struct ADS_Driver_ ADS_Driver;
typedef void (*ADfptrInit)(ADS_Driver*);
typedef uint16_t (*ADfptrRead)(ADS_Driver*, uint8_t);
struct ADS_Driver_
{
SPI_Driver* spi;
uint8_t ID;
uint16_t config;
uint16_t value[4];
ADfptrInit init;
ADfptrRead read;
};
ADS_Driver* new_ADS_Driver(uint8_t ADS_ID, SPI_TypeDef* SPIx_Port, GPIO_TypeDef* CS_GPIOx, uint32_t CS_Pin);
void ads_driver_init(ADS_Driver* const pADObj);
uint16_t ads_driver_read(ADS_Driver* const pADObj,uint8_t road);
uint16_t ads_driver_spi_transmit_receive_16(ADS_Driver* const pADObj, uint16_t TxData);
#endif
spi_driver.c
/* =================================================================================
File name: __ADS_DRIVER_C
Author: Mr.NoFish
===================================================================================*/
#include "ads_driver.h"
ADS_Driver* new_ADS_Driver(uint8_t ADS_ID, SPI_TypeDef* SPIx_Port, GPIO_TypeDef* CS_GPIOx, uint32_t CS_Pin)
{
ADS_Driver* pObj = NULL;
uint8_t i = 0;
pObj = (ADS_Driver*)malloc(sizeof(ADS_Driver));
if (pObj == NULL)
{
printf("WARN: ADS_Driver[%d] initialization failed.\r\n", ADS_ID);
return NULL;
}
printf("\t");
pObj->spi = new_SPI_Driver(SPIx_Port, CS_GPIOx, CS_Pin);
pObj->ID = ADS_ID;
pObj->init = ads_driver_init;
pObj->read = ads_driver_read;
printf("INFO: ADS_Driver[%d] initialization succeeded.\r\n", ADS_ID);
return pObj;
}
void ads_driver_init(ADS_Driver* const pADObj) //ADS1118初始化
{
pADObj->read(pADObj, 0);
}
uint16_t ads_driver_read(ADS_Driver* const pADObj, uint8_t road) //测几路电压
{
uint16_t config = 0;
config = ADS1118_CONFIG_SS_START_OFF | //
ADS1118_CONFIG_MODE_CONTIN | //连续转换模式
ADS1118_CONFIG_DR_128SPS | // 转换 速率 SPS
ADS1118_CONFIG_TS_MODE_ADC | // 读取ADC,而不是温度
ADS1118_CONFIG_PULL_UP_ON | //上拉电阻启用
ADS1118_CONFIG_NOP_VALID | // this is valid data (default
ADS1118_CONFIG_PGA_4_096V | // FSR is ±2_048 V
ADS1118_CONFIG_RESV; // reserved bits must be set to 1
switch(road) //选择有效转换的路数
{
case 0: config |= ADS1118_CONFIG_MUX_SINGLE_0;break; //AINP = AIN0 and AINN = GND
case 1: config |= ADS1118_CONFIG_MUX_SINGLE_1;break; //AINP = AIN1 and AINN = GND
case 2: config |= ADS1118_CONFIG_MUX_SINGLE_2;break; //AINP = AIN2 and AINN = GND
case 3: config |= ADS1118_CONFIG_MUX_SINGLE_3;break; //AINP = AIN3 and AINN = GND
default : break;
}
pADObj->config = config;
pADObj->spi->cs_l(pADObj->spi);
LL_uDelay(1);
pADObj->value[road] = pADObj->spi->tr16(pADObj->spi, pADObj->config);
pADObj->spi->cs_h(pADObj->spi);
return pADObj->value[road];
}
开发问题
然后测试发现F7的板子驱动这个会有很多问题,最后换回F4能用了,也不晓得为啥