单片机源程序如下:- #include "ads8681.h"
- #include "stm32f1xx_hal_def.h"
- /**
- * @brief SPI发送指定长度的数据
- * @param buf —— 发送数据缓冲区首地址
- * @param size —— 要发送数据的字节数
- * @retval 成功返回HAL_OK
- */
- // static HAL_StatusTypeDef SPI_Transmit(uint8_t* send_buf, uint16_t size)
- // {
- // return HAL_SPI_Transmit(&hspi1, send_buf, size, 100);
- // }
- /**
- * @brief SPI接收指定长度的数据
- * @param buf —— 接收数据缓冲区首地址
- * @param size —— 要接收数据的字节数
- * @retval 成功返回HAL_OK
- */
- // static HAL_StatusTypeDef SPI_Receive(uint8_t* recv_buf, uint16_t size)
- // {
- // return HAL_SPI_Receive(&hspi1, recv_buf, size, 100);
- // }
- /**
- * @brief SPI在发送数据的同时接收指定长度的数据
- * @param send_buf —— 接收数据缓冲区首地址
- * @param recv_buf —— 接收数据缓冲区首地址
- * @param size —— 要发送/接收数据的字节数
- * @retval 成功返回HAL_OK
- */
- static HAL_StatusTypeDef SPI_TransmitReceive(uint8_t* send_buf, uint8_t* recv_buf, uint16_t size)
- {
- return HAL_SPI_TransmitReceive(&hspi1, send_buf, recv_buf, size, 100);
- }
- /**
- * @brief ADS8681_Read_Write_Byte ———— ADS8681读写一个字节
- * @param dat —— 发送数据缓冲区
- * @param read_byte —— 接收数据缓冲区首地址
- * @retval read_byte
- */
- uint8_t ADS8681_Read_Write_Byte(uint8_t dat)
- {
- uint8_t read_byte;
- ADC_CS_L;
- SPI_TransmitReceive(&dat, &read_byte,1);
- ADC_CS_H;
- return read_byte ;
- }
- /**
- * @brief ADS8681_Read_Write_16Byte ——— ADS8681读写16位数据
- * @param dat —— 发送数据
- * @param write_buff —— 接收数据缓冲区首地址
- * @param read_buff —— 接收数据缓冲区首地址
- * @retval read_byte
- */
- uint16_t ADS8681_Read_Write_16Byte(uint16_t dat)
- {
- uint16_t read_byte;
- uint8_t write_buff[2];
- uint8_t read_buff[2];
- write_buff[0] = (dat>>8)&0xff;
- write_buff[1] = dat&0xff;
- ADC_CS_L;
- SPI_TransmitReceive(write_buff, read_buff,2);
- ADC_CS_H;
- read_byte = read_buff[0];
- read_byte = ((read_byte<<8)&0xff00)|read_buff[1];
- return read_byte;
- }
- /**
- * @brief aADS8681_reg_config ——— ADS8681操作寄存器,写数据,读数据
- * @param com —— 命令字(前7位为 List of Input Commands)
- * @param addrs —— 寄存器的地址(8-16位为Configuration Registers)
- * @param dat —— 寄存器的15-0位(17-32位为Configuration Registers数据位)
- * @retval result
- */
- uint32_t ADS8681_reg_config(uint8_t com,uint16_t address,uint16_t dat)
- {
- uint32_t result = 0;
- uint16_t temp = 0;
- ADC_CS_L;
- temp =(((com << 1) | ((address >> 8) & 1)) << 8) | (address & 0x00FF); //com和 address
- result = ADS8681_Read_Write_16Byte(temp);
- result = (result<<16)|ADS8681_Read_Write_16Byte(dat);
- ADC_CS_H;
- return result;
- }
- /**
- * @brief ADS8681_Read ——— ADS8681读数据,一次读32位
- * @retval read_buff
- */
- uint32_t ADS8681_Read(void)
- {
- unsigned long read_buff = 0;
- ADC_CS_L;
-
- read_buff = ((read_buff<<16)&0xffff0000)|ADS8681_Read_Write_16Byte(DUMMY);
- ADC_CS_H;
-
- return read_buff;
- }
- void ads8681_Init(void)
- {
- ADS_RST_L;
- ADS_RVS_L;
- HAL_Delay(100);
- ADS_RST_H;
- ADS8681_reg_config(0,0,0x00); //
- }
- void ADS8681_Display(void)
- {
- unsigned long temp1=0,temp=0;
- //采样5000次,去ADC抖动
- for (uint16_t i = 0; i <5000; i++)
- {
- temp1 = (unsigned long)ADS8681_Read();
- temp = temp+temp1;
- }
- //ADC采样转换结果
- temp = temp/5000;
- temp = (temp-32767)*24576; // 转换结公式 V=(采样结果-32767)*最大量程/65535
- temp = temp/65535*10;
- OLED_ShowNum(41,2,temp,5,16);
- }
复制代码
代码可能有不足和错误之处,仅供参考,vscode写的:
ADS8681.7z
(5.22 MB, 下载次数: 29)
|