- ADS8689.c
#include <stdio.h>
#include <string.h>
#include "ADS8689.h"
#include "delay.h"
static uint8_t receive[4] = {0};
const float reference_voltage = 4.096;
const uint8_t range = 5;
void ADS8689_Init(void)
{
GPIO_SetMode(PD, BIT0 | BIT1 | BIT3 | BIT4, GPIO_PMD_OUTPUT);
GPIO_SetMode(PD, BIT2, GPIO_PMD_INPUT);
ADS8689_CS = 1;
ADS8689_SCLK = 0;
ADS8689_SDIN = 1;
ADS8689_RST = 0;
delay_ms(10);
ADS8689_RST = 1;
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0040); // 外部双极性24.576
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0041); // 双极性20.48
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0042); // 双极性12.889
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0043); // 双极性10.24
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0044); // 双极性5.12
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0048); // 单极性12.889
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0049); // 单极性10.24
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x004A); // 单极性6.144
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x004B); // 单极性5.12
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0000); // 内部双极性24.576
ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0001); // 双极性20.48
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0002); // 双极性12.889
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0003); // 双极性10.24
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0004); // 双极性5.12
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0008); // 单极性12.889
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x0009); // 单极性10.24
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x000A); // 单极性6.144
// ADS8689_ReadWrite(ADS8689_WRITE_FULL, ADS8689_RANGE_SEL_REG, 0x000B); // 单极性5.12
}
uint8_t *ADS8689_ReadWrite(uint8_t command, uint8_t address, uint16_t data)
{
uint8_t buff[4] = {0};
uint8_t rece_byte = 0;
uint8_t i = 0, j = 0, byte = 0;
buff[0] = (command << 1);
buff[1] = address;
buff[2] = ((data >> 8) & 0xff);
buff[3] = (data & 0xff);
ADS8689_CS = 0;
for (i = 0; i < 4; i++)
{
byte = buff[i];
for (j = 0; j < 8; j++)
{
if(byte & 0x80)
{
ADS8689_SDIN = 1;
}
else
{
ADS8689_SDIN = 0;
}
byte <<= 1;
ADS8689_SCLK = 1;
rece_byte <<= 1;
rece_byte |= ADS8689_SDO;
ADS8689_SCLK = 0;
}
receive[i] = rece_byte;
}
ADS8689_SCLK = 0;
ADS8689_CS = 1;
return receive;
}
void ADS8689_Analog_Digital(void)
{
static uint16_t temp;
static float x;
const float w = 3.0;
ADS8689_ReadWrite(ADS8689_NOP, 0x00, 0x0000);
ADS8689_ReadWrite(ADS8689_NOP, 0x00, 0x0000);
temp = ((uint16_t)receive[0] << 8) + receive[1];
x = (float)((((temp - 32768) * range) * reference_voltage) / 65536);
x *= w;
printf("%0.6f\r", x);
}
- ADS8689.h
#ifndef __ADS8689_H__
#define __ADS8689_H__
#include <stdint.h>
#include "NUC123.h"
#include "serial_protocol.h"
#define SOFT_ADC
#define ADS8689_CS PD0
#define ADS8689_SCLK PD1
#define ADS8689_SDO PD2
#define ADS8689_SDIN PD3
#define ADS8689_RST PD4
// Configuration Regsiter Mapping
#define ADS8689_DEVICE_ID_REG 0x00
#define ADS8689_RST_PWRCTL_REG 0x04
#define ADS8689_SDI_CTL_REG 0x08
#define ADS8689_SDO_CTL_REG 0x0C
#define ADS8689_DATAOUT_CTL_REG 0x10
#define ADS8689_RANGE_SEL_REG 0x14
#define ADS8689_ALARM_REG 0x20
#define ADS8689_ALARM_H_TH_REG 0x24
#define ADS8689_ALARM_L_TH_REG 0x28
// SPI commands
#define ADS8689_NOP 0x00
#define ADS8689_CLEAR_HWORD (0xC0 >> 1)
#define ADS8689_READ_HWORD (0xC8 >> 1)
#define ADS8689_READ (0x48 >> 1)
#define ADS8689_WRITE_FULL (0xD0 >> 1)
#define ADS8689_WRITE_MS (0xD2 >> 1)
#define ADS8689_WRITE_LS (0xD4 >> 1)
#define ADS8689_SET_HWORD (0xD8 >> 1)
void ADS8689_Init(void);
uint8_t *ADS8689_ReadWrite(uint8_t command, uint8_t address, uint16_t data);
void ADS8689_Analog_Digital(void);
#endif
因为是软件模拟spi通信,稍微修改就可以用于其他单片机上。如果需要源代码,请在此下载
源代码