main.c
#include "bsp_mcp3421.h"int main(){ float mcp3421_dat = 0; while(1) { MCP3421_Init(); // 初始化设置 MCP3421_Read(&mcp3421_dat); // 获取值 }}
bsp_mcp3421.h
#ifndef _BSP_MCP3421_H#define _BSP_MCP3421_H#include "stm32f10x.h"#define SLAVE_ADDRESS 0xd0 // 设备地址/* 寄存器配置*/#define CONTINUOUS_TRANSITION 0x10 // 启动连续转换#define SINGLE_TRANSITION 0x00 // 启动单次转换#define READY_FLAG 0x80 // 就绪标志位// 采样率选择位#define SAMPLE_RATE_SELECT_12bit 0x00 // 12位 240sps#define SAMPLE_RATE_SELECT_14bit 0x04 // 14位 60sps#define SAMPLE_RATE_SELECT_16bit 0x08 // 16位 15sps#define SAMPLE_RATE_SELECT_18bit 0x0c // 18位 3.75sps// PGA 增益选择位#define PGA_SELECT_Bit_1V 0x00 // 1 V/V#define PGA_SELECT_Bit_2V 0x01 // 2 V/V#define PGA_SELECT_Bit_4V 0x02 // 4 V/V#define PGA_SELECT_Bit_8V 0x03 // 8 V/Vvoid MCP3421_Single_Transition();char MCP3421_Read_Data(uint8_t *buf, uint8_t sum);int MCP3421_Read(float *dat);void MCP3421_Init();#endif //_BSP_MCP3421_H
bsp_mcp3421.c
#include "bsp_mcp3421.h"#include "bsp_i2c.h"#include "bsp_tim2.h"#include "bsp_tim3.h"#include "stdio.h"#include "bsp_DMAusart2.h"/****************************************************** *MCP_3421模数转换传感器 * * * *输出代码 = (指定采样速率下的最大代码+1)*PGA * (Vin+ - Vin-)/LSB *LSB = 2*VREF/2^SPS=2*2.048V / 2^SPS * *当MSB=0(输入正电压) * 输入电压=(输出代码)* LSB /PGA * *当MSB=1(输入负电压) * 输入电压=(输出代码的二进制补码) * LSB /PGA **********************************************************/// 读数据char MCP3421_Read_Data(uint8_t *buf, uint8_t sum){ if(buf == NULL || sum == 0) { return -1; } int i = 0; i2c_Start(); i2c_SendByte(SLAVE_ADDRESS + 1); i2c_WaitAck(); //Delay_ms(100); for( ; i<(sum-1); i++) { *buf = i2c_ReadByte(1); buf++; } *buf = i2c_ReadByte(0); i2c_WaitAck(); i2c_Stop(); return 0;}// 18位模式下读取数据int MCP3421_Read(float *dat){ if(dat == NULL) { return -1; } float ADC = 0; float LSB = (float)((2.0*2.048)/65536.0); //32768.0 uint8_t PGA = 1; uint8_t bufs[3] = {0}; int AD_B_Result = 0; MCP3421_Read_Data(bufs, 3); AD_B_Result = (int)((bufs[0] << 8) | bufs[1]); ADC = (float)((LSB * AD_B_Result)/PGA); //*dat = 6.2307*ADC-7.4601; *dat = 6.2307*ADC-7.4600; // 将获取的电压信号转转压力值 /* MCP3421有正负输入电压 *这里只做正电压判断 */}// 写配置void MCP3421_Write_Data(uint8_t dat){ i2c_Start(); i2c_SendByte(SLAVE_ADDRESS); i2c_WaitAck(); i2c_SendByte(dat); i2c_WaitAck(); i2c_Stop();}// 单次转换void MCP3421_Single_Transition(){ MCP3421_Write_Data(SINGLE_TRANSITION // 启动单次转换 | SAMPLE_RATE_SELECT_16bit // 16位 | PGA_SELECT_Bit_1V); // PGA 增益选择位// MCP3421_Write_Data(0x0b);}// 连续转换void MCP3421_Continuous_Transition(){ MCP3421_Write_Data(CONTINUOUS_TRANSITION // 启动连续转换 | SAMPLE_RATE_SELECT_16bit // 16位 | PGA_SELECT_Bit_1V); // PGA 增益选择位// MCP3421_Write_Data(0x8b);}// 寄存器初始化void MCP3421_Config(){ MCP3421_Continuous_Transition(); //MCP3421_Single_Transition();}// 复位void MCP3421_Reset(){ i2c_Start(); i2c_SendByte(SLAVE_ADDRESS); i2c_WaitAck();}// 初始化void MCP3421_Init(){ MCP3421_Config();}