请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:ADS1248 尊敬的团队:
我们正在尝试使用 C8051F020微控制器集成 ADS1248,以测量热电偶温度。
请找到所附的源代码并指导我们的配置过程以获得最佳结果。
等待您的回复。
#include "MCTI1058-TC.h"
void main(void)
{
uc_init();
ADS1248_SPI_Init();
ADS1248_Reset();
Set_pins_idle_state();
ADS1248_SDATAC();
ADS1248_Config();
ADS1248_SYNC();
ADS1248_VBIAS();
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
DelayMicroSeconds(1000);
ADS1248_WAKEUP();
do{
Read_ADS1248();
}while(1);
}
void timre0_isr(void) interrupt 1
{
// unsigned char xdata p,kvalue=0x01,virtkeyport,keybase = 0xff; // keypad related
// static unsigned char intdlycntr = 0;
// TH0 = 0xFE;//f8
// TL0 = 0xFE;//5c
TH0 = 0xF8;//f8
TL0 = 0x5C;//5c
TF0 = 0;
// drdy_flag=1;
return;
}
void ADS1248_SPI_Init(void)
{
SPI0CFG = 0xBF; //Data sampled on first edge of SCK period.
//SCK line low in idle state (MODE-1)
//MSB Transmitted first
//8 dataa bits shifted from shift registerr
SPI0CN = 0x03; //Enable master mode(Operate as a master) and SPI Enabled.
// SPI0CKR = 0x1F; //200kHz speed of spi clock // SPI0CKR = 0x03; //2MegaHz spi clock //
SPI0CKR = (SYSCLK/(2*SPI_CLOCK))-1;
// SPIEN = 1;
}
void ADS1248_Reset(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
TXBSY |= 0;
SPI0DAT = ADS1248_CMD_RESET;
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void DelayMicroSeconds(u32t nbrOfUs) /* -- adapt this delay for your uC -- */
{
u32t i,j;
for(i = 0; i < nbrOfUs; i++){
for(j = 0; j < 10; j++);
}
}
void Set_pins_idle_state(void)
{
bitset(RELAYPORT,0);// ADS1248_CHIPSELECT = 1;
bitset(RELAYPORT,4);//ADS1248_START_PIN = 1;
// ADS1248_RESET_PIN = 1;
}
void ADS1248_SDATAC(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
TXBSY |= 0;
SPI0DAT = ADS1248_CMD_SDATAC;
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void ADS1248_Config(void)
{
bitset(RELAYPORT,4);//ADS1248_START_PIN = 1;
// ADS1248_RESET_PIN = 1;
voltage_reference(); //Internal reference input pins selected (REFP0 and REFN0)
Data_Rate(); //gain = 4, datarate = 20sps
SetChannel(); //AIN0 FOR +VE and AIN1 FOR -VE
SetDRDYMode();// DRDY/OUT PIN ACT AS OUTPUT PIN AND 1000MICRO AMP CURRENT
}
void voltage_reference(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
TXBSY |= 0;
SPI0DAT = 0x42; //( ADS1248_CMD_WREG | ADS1248_2_MUX1);
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x01;
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x20; //REFP0 and REFN0 reference inputs selected (default)
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void Data_Rate(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
TXBSY |= 0;
SPI0DAT = 0x43; // ( ADS1248_CMD_WREG | ADS1248_3_SYS0); //
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x01;
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x52; // gain = 4, datarate = 20sps for 1mAmp 0x22
// gain = 32, datarate = 20sps for 1mAmp 0x52
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void SetChannel(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
TXBSY |= 0;
SPI0DAT = 0x40; // ( ADS1248_CMD_WREG | ADS1248_0_MUX0); //
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x01;
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x01; // AIN0 AND AINP1 //9 AIN1 | AINP1
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
DelayMicroSeconds(10000);
}
void SetDRDYMode(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
// SPIEN = 1;
TXBSY |= 0;
SPI0DAT = 0x4A; //( ADS1248_CMD_WREG | ADS1248_10_IDAC0); //IDAC REGISTER
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x01;
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x00; // DRDY/OUT PIN ACT AS OUTPUT PIN AND 1000MICRO AMP CURRENT
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void ADS1248_VBIAS(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
// SPIEN = 1;
TXBSY |= 0;
SPI0DAT = 0x41; // ( ADS1248_CMD_WREG | ADS1248_0_MUX0);
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x01;
while(TXBSY);
TXBSY |= 0;
SPI0DAT = 0x00; // VBIAS OFF
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void ADS1248_SYNC(void)
{
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
TXBSY |= 0;
SPI0DAT = ADS1248_CMD_SYNC;
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void ADS1248_WAKEUP(void)
{
bitset(RELAYPORT,4);//ADS1248_START_PIN =1; //START PIN should be High while sending WAKEUP COMMAND
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);
TXBSY |= 0;
SPI0DAT = ADS1248_CMD_WAKEUP;
while(TXBSY);
TXBSY |= 0;
DelayMicroSeconds(1);
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
}
void Delayms(short msec)
{
short l, m;
if((msec & 0x80)!= 0)
msec = 0x7F;
msec = msec << 2; // shift left
for (l = 0; l <msec; l ++)
for (m = 0; m <5; m ++);
}
long ADS1248_RDATA(void)
{
unsigned char var;
long result;
char res[3];
bitclear(RELAYPORT,0);//ADS1248_CHIPSELECT = 0;
DelayMicroSeconds(1);//Delayms(1); //delay beteween data read and chip select high and low is 74msec
var = ADS1248_SPI0_Write(ADS1248_CMD_RDATA); //Read data once
res[0] = ADS1248ReceiveByte();
res[1] = ADS1248ReceiveByte();
res[2] = ADS1248ReceiveByte();
var = ADS1248ReceiveByte(); //a NOP can be sent to force DOUT/DRDY high if no other command is pending
DelayMicroSeconds(1);//Delayms(1); //delay beteween data read and chip select high and low is 74msec
bitset(RELAYPORT,0);//ADS1248_CHIPSELECT = 1;
result = 0x00;
result = (res[0] & 0xFF); //must & 0xFF otherwise random errors occure
result = (result << 8);
result = result | ( res[1] & 0xFF );
result = (result << 8);
result = result | ( res[2] & 0xFF );
return( result );
}
unsigned char ADS1248_SPI0_Write(unsigned char txdata)
{
TXBSY |= 0;
SPI0DAT = txdata; //send data
while(TXBSY);
TXBSY |= 0;
return SPI0DAT;
}
unsigned char ADS1248ReceiveByte(void)
{
unsigned char Result = 0;
while(TXBSY); // Make sure nothing is already in the TX buffer
TXBSY |= 0;
SPI0DAT = 0xFF; // Send out NOP to initiate SCLK
while(TXBSY); // Wait until all data is transmitted (received)
TXBSY |= 0;
Result = SPI0DAT; // Capture the receive buffer and return the Result
return Result;
}
void INT0_ISR (void) interrupt 0
{
IE0 = 0;
drdy_flag=1;
}
void INT1_ISR (void) interrupt 2
{
IE1 = 0;
drdy_flag1=1;
}
void SPI_ISR (void) interrupt 6 //This interrupt number we can find in datasheet page number 117, it is the priority of SPI interrupt
{
WCOL = 0; // Clear the write collision flag
SPIF = 0; // Clear the SPIF flag
}
void Read_ADS1248(void)
{
// static float ltemperature;
static unsigned long int loutput_code;
float mVolts = 0;
// double R_Data1;
samplecnt++;
if(drdy_flag == 1)
{
drdy_flag=0;
bitclear(RELAYPORT,4);//ADS1248_START_PIN =0; //POWER DOWN MODE
DelayMicroSeconds(1);//Delayms(1);
output_code1 = ADS1248_RDATA();
if (output_code1 & 0x800000)
output_code1 |= 0xff000000;
bitset(RELAYPORT,4);//ADS1248_START_PIN =1; //CONVERSION MODE
DelayMicroSeconds(1);//Delayms(1);
}
output_code = (output_code1); //+ Cal_Offset//output_code = ((output_code1 + output_code2)/2);
loutput_code = output_code + loutput_code;
if(samplecnt >= ADS1248_MAX_SAMPLES){
loutput_code = loutput_code/ADS1248_MAX_SAMPLES;
// ltemp = (loutput_code * 2.048) / (32 * 32768);
mVolts = (float)(loutput_code * 2.048) / (268435456); //(2^23 *32)
samplecnt = 0;
loutput_code = 0;
readcomp = 1;
}
else;
}
void uc_init(void)
{
int xdata i;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x0C;
XBR0 = 0x06;
XBR1 = 0x14;
XBR2 = 0x40;
// P0MDOUT = 0xFF;
P0MDOUT = 0x35;
P1MDOUT = 0x7f;
P1MDOUT &= 0xf3;
P2MDOUT = 0xff;
P3MDOUT = 0xff;
P74OUT = 0xff;
PCON |= 0x80;
AMX0CF = 0x00; // AMUX Configuration Register
AMX0SL = 0x00; // AMUX Channel Select Register
ADC0CF = 0xf8; // SAR clk=2.1MHz,PGA=0.5
ADC0CN = 0x00; // ADC Control Register
ADC0LTH = 0x00; // ADC Less-Than High Byte Register
ADC0LTL = 0x00; // ADC Less-Than Low Byte Register
ADC0GTH = 0xFF; // ADC Greater-Than High Byte Register
ADC0GTL = 0xFF; // ADC Greater-Than Low Byte Register
TH0 = 0xf7; //f82f-2ms f8f7-1.8ms
TL0 = 0x5c;
TR0 = 1;
CKCON |= 0x10;
TMOD = 0x21;
TH1 = 0x71;
PCON |= 0x80;
TR1 = 1;
SCON0 = 0xd0;
ES0 = 1;
IE |= 0x92;
IP = 0x10;
EIE1 |= 0x01; //Enable Serial Peripheral Interface (SPI0) Interrupt.Enable Interrupt requests generated by the SPIF flag (SPI0CN.7)
EIP1 |= 0x01; //SPI0 interruptS set to high priority level
IE |= 0x82; //IE|= 0x92; //Enable interrupt requests generated by the TF0 flag (TCON.5) & Enable each interrupt according to its individual mask setting.
TCON = 0x05; // /INT 0 and /INT 1 are falling edge
// triggered
// EX0 = 1; // Enable /INT0 interrupts
// EX1 = 1; // Enable /INT1 interrupts
// IE |= 0xBA;
// IP |= 0x17;
//
EX0 = 1; //External interrrupt0 enabled
IT0 = 1; //INT0 is falling edge triggered
PX0 = 1; //INT0 is High PRIORITY
EX1 = 1; //External interrrupt1 enabled
IT1 = 1; //INT1 is falling edge triggered
PX1 = 1; //INT1 is High PRIORITY
EA = 1;
return;
}