工程文件参考——ADS1118多从机驱动(base on spi_driver)


前言

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能用了,也不晓得为啥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值