This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS1248:响应始终为0x007FFFFF

Guru**** 2535750 points
Other Parts Discussed in Thread: ADS1248

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1083622/ads1248-response-always-0x007fffff

部件号: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;
}



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Veeraswamy,

    感谢您发布该代码。 但是,获取数字通信的逻辑分析器图解将会更加有用-您能否提供这些信息,以便我们可以看到与 ADC 的所有通信?

    您是否检查过 ADC 电源是否稳定且不会出现电流下降?

    ADC 是否与接地连接牢固?

    如果您能提供系统示意图,以便我们更好地了解正在发生的情况,可能会有所帮助。 谢谢!

    布莱恩