nuc123 ADS8689 software simulation SPI driver

  • 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

Because the software simulates spi communication, it can be used on other microcontrollers with a little modification. If you need the source code, please download the
source code here

Guess you like

Origin blog.csdn.net/cp_srd/article/details/106878147