基于TMS320F28335的ADS1248芯片驱动源码

// ASSUMPTIONS:
//            SCLK        GPIO18
//            DIN         GPIO16
//            DOUT        GPIO17
//            /DRDY       GPIO13
//            /CS         GPIO19
//            START       GPIO15
//            /RESET      GPIO14

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define ADS1248_CMD_WAKEUP    	0x00
#define ADS1248_CMD_SLEEP     	0x03
#define ADS1248_CMD_SYNC     	0x05
#define ADS1248_CMD_RESET    	0x07
#define ADS1248_CMD_NOP    		0xFF
// Data Read
#define ADS1248_CMD_RDATA    	0x13
#define ADS1248_CMD_RDATAC    	0x15
#define ADS1248_CMD_SDATAC    	0x17
// Read Register
#define ADS1248_CMD_RREG    	0x20
// Write Register
#define ADS1248_CMD_WREG    	0x40
// Calibration
#define ADS1248_CMD_SYSOCAL    	0x60
#define ADS1248_CMD_SYSGCAL    	0x61
#define ADS1248_CMD_SELFOCAL    0x62


/* ADS1248 Register Definitions */
#define ADS1248_0_MUX0   		0x00
#define ADS1248_1_VBIAS     	0x01
#define ADS1248_2_MUX1	     	0x02
#define ADS1248_3_SYS0	    	0x03
#define ADS1248_4_OFC0	    	0x04
#define ADS1248_5_OFC1	    	0x05
#define ADS1248_6_OFC2	    	0x06
#define ADS1248_7_FSC0	    	0x07
#define ADS1248_8_FSC1	    	0x08
#define ADS1248_9_FSC2	    	0x09
#define ADS1248_10_IDAC0	   	0x0A
#define ADS1248_11_IDAC1	   	0x0B
#define ADS1248_12_GPIOCFG    	0x0C
#define ADS1248_13_GPIODIR    	0x0D
#define ADS1248_14_GPIODAT    	0x0E

// Define Reference Select
#define ADS1248_REF0			0x00
#define ADS1248_REF1			0x08
#define ADS1248_INT				0x10
#define ADS1248_INT_REF0		0x18
// Define Internal Reference
#define ADS1248_INT_VREF_OFF	0x00
#define ADS1248_INT_VREF_ON		0x20
#define ADS1248_INT_VREF_CONV	0x40


/* Error Return Values */
#define ADS1248_NO_ERROR        0
#define ADS1248_ERROR			-1

//void spi_xmit(Uint16 a);
void spi_xmit(unsigned char a);
void spi_fifo_init(void);
void spi_init(void);
unsigned char ADS1248ReceiveByte(void);
int ADS1248SetIntRef(int sRef);
int ADS1248SetVoltageReference(int VoltageRef);

void ADS1248SendByte(unsigned char Byte);
void ADS1248SetReset(int nReset);
int ADS1248GetID(void);
void ADS1248WriteRegister(int StartAddress, int NumRegs, unsigned * pData);
void ADS1248ReadRegister(int StartAddress, int NumRegs, unsigned * pData);
long ADS1248ReadData(void);

Uint16 * pData;
unsigned sdata1;
unsigned sdata2;
int i;
Uint16 senddata;
unsigned rdata = 2;
int ii = 0;
unsigned char data_rdyn;
long ADC_result_data = 100;
int flag_start = 1;

void main(void)
{
   InitSysCtrl();
   InitGpio();
   InitSpiaGpio();
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

   spi_fifo_init();	  // Initialize the Spi FIFO
   spi_init();		  // init SPI

   // START拉高
   GpioDataRegs.GPADAT.bit.GPIO15 = 1;DELAY_US(2);

   ADS1248SetReset(0);		//复位
   DELAY_US(100000);
   ADS1248SetReset(1);
   DELAY_US(1000000);

   sdata1 = 0x01;	// Burnout current source off,Positive input channel:000 = AIN0,Negative input channel:001 = AIN1
   ADS1248WriteRegister(ADS1248_0_MUX0, 0x01, &sdata1);
   DELAY_US(1000);

   sdata1 = 0x00; //Bias voltage not enabled;
   ADS1248WriteRegister(ADS1248_1_VBIAS, 0x01, &sdata1);
   DELAY_US(100);

//   sdata1 = 0x40;
   sdata1 = 0x20; //Internal oscillator in use;Internal reference is always on;REF0 input pair selected;Normal operation
   ADS1248WriteRegister(ADS1248_2_MUX1, 0x01, &sdata1);
   DELAY_US(100);

   sdata1 = 0x06; // PGA = 1;output data rate of the ADC: 320SPS
   ADS1248WriteRegister(ADS1248_3_SYS0, 0x01, &sdata1);
   DELAY_US(100);

    使用默认值
//   sdata1 = 0x00;
//   ADS1248WriteRegister(ADS1248_4_OFC0, 0x01, &sdata1);
//   DELAY_US(100);
//
//   sdata1 = 0x00;
//   ADS1248WriteRegister(ADS1248_5_OFC1, 0x01, &sdata1);
//   DELAY_US(100);
//
//   sdata1 = 0x00;
//   ADS1248WriteRegister(ADS1248_6_OFC2, 0x01, &sdata1);
//   DELAY_US(100);

//   sdata1 = 0x00;
//   ADS1248WriteRegister(ADS1248_7_FSC0, 0x01, &sdata1);
//   DELAY_US(100);

//   sdata1 = 0x00;
//   ADS1248WriteRegister(ADS1248_8_FSC1, 0x01, &sdata1);
//   DELAY_US(100);
//
//   sdata1 = 0x00;
//   ADS1248WriteRegister(ADS1248_9_FSC2, 0x01, &sdata1);					//配置该寄存器似乎有问题
//   DELAY_US(100);

   sdata1 = 0x04;  // DOUT/DRDY pin functions only as Data Out;current source DACs = 500μA
   ADS1248WriteRegister(ADS1248_10_IDAC0, 0x01, &sdata1);
   DELAY_US(100);

   sdata1 = 0x89;	//first current source DAC:10x0 = IEXT1;the second current source DAC:10x1 = IEXT2;
   ADS1248WriteRegister(ADS1248_11_IDAC1, 0x01, &sdata1);
   DELAY_US(100);

//   sdata1 = 0x00; //
//   ADS1248WriteRegister(ADS1248_12_GPIOCFG, 0x01, &sdata1);
//   DELAY_US(100);
   // START拉低
   GpioDataRegs.GPADAT.bit.GPIO15 = 0;
   DELAY_US(20);
//
//   GpioDataRegs.GPADAT.bit.GPIO15 = 1;DELAY_US(20);
//   while((data_rdyn = GpioDataRegs.GPADAT.bit.GPIO13) == 0)
//   while(1)
//   {
//	   DELAY_US(5);
//	   ADC_result_data = ADS1248ReadData();
//	   DELAY_US(5);
while(1){
		flag_start = 1;
		// 启动转换
	    GpioDataRegs.GPADAT.bit.GPIO15 = 1;					// start_high
	    DELAY_US(100);										// 延时
	    GpioDataRegs.GPADAT.bit.GPIO15 = 0;					// start_low
	    DELAY_US(1);

	    // 判断转换标志位:/RDY
	    while(flag_start)
	    {
		   data_rdyn = GpioDataRegs.GPADAT.bit.GPIO13;
		   if(data_rdyn == 0)
		   {
			   ADC_result_data = ADS1248ReadData();
			   DELAY_US(1000);
			   flag_start = 0;
		   }
	    }


	// 读取寄存器的值
//	GpioDataRegs.GPADAT.bit.GPIO15 = 1;					// start_high
//	DELAY_US(100);
//	ADS1248ReadRegister(ADS1248_11_IDAC1, 0x01, &sdata2);
//	DELAY_US(100);

   }

}

long ADS1248ReadData(void)
{
	long Data;
	// assert CS to start transfer
//	ADS1248AssertCS(0);
	// send the command byte
	ADS1248SendByte(ADS1248_CMD_RDATA);
	DELAY_US(50);	// 延时必须大于50us,否则读取不正确
	// get the conversion result
	Data = ADS1248ReceiveByte();
	Data = (Data << 8) | ADS1248ReceiveByte();
	Data = (Data << 8) | ADS1248ReceiveByte();
	// sign extend data if the MSB is high (24 to 32 bit sign extension)
//	if (Data & 0x800000)
//		Data |= 0xff000000;
	// de-assert CS
//	ADS1248AssertCS(1);
	return Data;
}


int ADS1248GetID(void)
{
	unsigned Temp;
	ADS1248ReadRegister(ADS1248_10_IDAC0, 0x01, &Temp);
	return ((Temp>>4) & 0x0f);
}

// Relate to Mux1
int ADS1248SetIntRef(int sRef)
{
	unsigned Temp;
	int dError = ADS1248_NO_ERROR;
	ADS1248ReadRegister(ADS1248_2_MUX1, 0x01, &Temp);
	Temp &= 0x1f;
	switch(sRef) {
		case 0:
			Temp |= ADS1248_INT_VREF_OFF;
			break;
		case 1:
			Temp |= ADS1248_INT_VREF_ON;
			break;
		case 2:
		case 3:
			Temp |= ADS1248_INT_VREF_CONV;
			break;
		default:
			Temp |= ADS1248_INT_VREF_OFF;
			dError = ADS1248_ERROR;

	}
	// write the register value containing the new value back to the ADS
	ADS1248WriteRegister(ADS1248_2_MUX1, 0x01, &Temp);
	return dError;
}

int ADS1248SetVoltageReference(int VoltageRef)
{
	unsigned Temp;
	int dError = ADS1248_NO_ERROR;
	ADS1248ReadRegister(ADS1248_2_MUX1, 0x01, &Temp);
	Temp &= 0xe7;
	switch(VoltageRef) {
		case 0:
			Temp |= ADS1248_REF0;
			break;
		case 1:
			Temp |= ADS1248_REF1;
			break;
		case 2:
			Temp |= ADS1248_INT;
			break;
		case 3:
			Temp |= ADS1248_INT_REF0;
			break;
		default:
			Temp |= ADS1248_REF0;
			dError = ADS1248_ERROR;
	}
	// write the register value containing the new value back to the ADS
	ADS1248WriteRegister(ADS1248_2_MUX1, 0x01, &Temp);
	return dError;
}

void ADS1248SetReset(int nReset)
{
	// This example is using PORT6 for GPIO Reset Control, ADS1248_RESET is defined in ads1248.h
	if (!nReset)								// nReset=0 is RESET low, nReset=1 is RESET high
		GpioDataRegs.GPADAT.bit.GPIO14 = 0;
	else
		GpioDataRegs.GPADAT.bit.GPIO14 = 1;
}

void ADS1248WriteRegister(int StartAddress, int NumRegs, unsigned * pData)
{
	int i;
	// set the CS low
//	ADS1248AssertCS(0);
	// send the command byte
	ADS1248SendByte(ADS1248_CMD_WREG | (StartAddress & 0x0f));
	ADS1248SendByte((NumRegs-1) & 0x0f);
	// send the data bytes
	for (i=0; i < NumRegs; i++)
	{
		ADS1248SendByte(*pData++);
	}
	// set the CS back high
//	ADS1248AssertCS(1);
}

void ADS1248ReadRegister(int StartAddress, int NumRegs, unsigned * pData)
{
	int i;
	// send the command byte
	ADS1248SendByte(ADS1248_CMD_RREG | (StartAddress & 0x0f));
	ADS1248SendByte((NumRegs-1) & 0x0f);
	DELAY_US(100);
	// get the register content
	for (i=0; i< NumRegs; i++)
	{
		*pData++ = ADS1248ReceiveByte();
	}
	return;
}

void ADS1248SendByte(unsigned char Byte)
{
//	SpiaRegs.SPITXBUF = Byte;
	spi_xmit(Byte);
}

unsigned char ADS1248ReceiveByte(void)
{
	unsigned char Result = 0;
	int16 result_0 = 0;
//	unsigned int flag = 1;								// 这里做了一个取巧,因为读出来了多个无效数据,无效数据均为0,因此增加一个标志位,将无效数据屏蔽掉。

	ADS1248SendByte(ADS1248_CMD_NOP);					// Send out NOP to initiate SCLK
//	while(flag){
		while(SpiaRegs.SPIFFRX.bit.RXFFST == 0)	{}			// 因为连续发送了三个指令,接收也是连续接收了多个字符?
		result_0 = SpiaRegs.SPIRXBUF;							// Capture the receive buffer and return the Result
//		if(result_0 != 0)
//			flag = 0;
//	}
	Result = result_0 & 0x00ff;							// Capture the receive buffer and return the Result
	return Result;
}

void spi_xmit(unsigned char a)
{
	Uint16 senddata;
	senddata = (a << 8) & 0xff00;				// 发送数据小于16位必须采用左对齐,首先发送最高位
    SpiaRegs.SPITXBUF = senddata;
}

void spi_fifo_init()
{
// Initialize SPI FIFO registers
    SpiaRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=0x204f;
    SpiaRegs.SPIFFCT.all=0x0;
}

void spi_init()
{
//	SpiaRegs.SPICCR.all =0x000F;	             // Reset on, rising edge, 16-bit char bits
	SpiaRegs.SPICCR.all =0x0007;	             // Reset on, rising edge, 8-bit char bits
	SpiaRegs.SPICTL.all =0x0006;    		     // Enable master mode, normal phase,
                                                 // enable talk, and SPI int disabled.
	SpiaRegs.SPIBRR =0x007F;					 // SPI速率
//    SpiaRegs.SPICCR.all =0x009F;		         // Relinquish SPI from Reset,16-bit char bits
	SpiaRegs.SPICCR.all =0x0097;		         // Relinquish SPI from Reset,8-bit char bits
    SpiaRegs.SPICCR.bit.SPILBK = 0;				 // spi 自测模式禁止
    SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission
}



 spi总线发送数据,读寄存器的值
//spi_xmit(ADS1248_CMD_RREG | (StartAddress & 0x0f));
//spi_xmit((NumRegs-1) & 0x0f);
	   spi_xmit(0x55);
//
 读取寄存器接收的值
		for (i=0; i< NumRegs; i++)
		{
			*pData++ = ADS1248ReceiveByte();
		}
	   while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
	   rdata = SpiaRegs.SPIRXBUF;
	   // 发送nop
	   spi_xmit(sdata);
 CS 拉高
	   GpioDataRegs.GPADAT.bit.GPIO19 = 1;

//===========================================================================
// No more.
//===========================================================================

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TMS320F28335是德州仪器(TI)公司开发的一个数字信号处理器(DSP)芯片,广泛应用于实时控制和信号处理领域。基于TMS320F28335的示波器设计主要是利用其强大的处理能力和丰富的外设接口,实现对信号的采集、处理和显示。 首先,示波器的设计需要通过合适的外部电路将待测信号输入到TMS320F28335芯片。可以使用模拟输入接口(ADC)来采集模拟信号,并通过模数转换将其转换为数字信号,进而被DSP处理。另外,还可以利用数字输入输出接口(DIO)进行数字信号的采集和输出。 其次,在TMS320F28335上进行信号处理过程。通过使用DSP核心中的算术逻辑单元(ALU)、信号计算单元(SCU)等功能模块,可以实现信号的滤波、调制、解调、频谱分析、波形显示等处理操作。同时,TMS320F28335还配备了丰富的存储器资源,可以有效地存储和管理处理过的信号数据。 最后,示波器设计需要将处理后的信号在显示器上进行显示。TMS320F28335上配备了专门的图形显示接口(GIO),可以方便地将处理结果输出到显示器上,实现波形的实时显示和观测。 基于TMS320F28335的示波器设计具有高度灵活性和可扩展性,可以根据具体应用需求进行定制和优化。同时,TMS320F28335的高性能和低功耗特性也使得示波器具有较高的计算速度和较长的工作时间。该设计在工业控制、通信、医疗、电力等领域有着广泛的应用前景。 ### 回答2: 基于TMS320F28335的示波器设计是一个基于数字信号处理技术的仪器,可以用于测量和显示电子信号的波形。TMS320F28335是德州仪器公司推出的一款高性能DSP芯片,具有强大的浮点运算和高速时钟,能够实时处理高速信号。 在设计示波器时,首先需要将采集的模拟信号转换为数字信号。可以通过引入一个模拟-数字转换器(ADC)模块,将模拟信号转换为数字信号。TMS320F28335的内部ADC模块拥有多通道,高速采样率,可以满足波形采集的需要。 接下来,需要对数字信号进行处理和存储。TMS320F28335具有丰富的存储空间,可以通过内部的Flash存储器或者外部存储器来存储采集到的波形数据。同时,TMS320F28335还内置了多达150个的数字信号处理器,可以对波形信号进行滤波、傅里叶变换等数学操作,以得到更加准确的波形分析结果。 最后,需要通过一个显示设备将处理后的波形数据进行显示。可以选择使用液晶显示屏或者计算机屏幕等高分辨率设备来显示波形。通过连接TMS320F28335的IO引脚,将处理后的数字信号输出到显示设备进行显示,用户就可以直观地观察和分析波形信号。 总的来说,基于TMS320F28335的示波器设计是将模拟信号转换为数字信号,通过TMS320F28335进行数字信号处理和存储,并通过显示设备进行波形显示的过程。这种设计能够实现高精度、高速的波形采集和分析,可以应用于电子技术研究、通信系统验证等领域。 ### 回答3: 基于TMS320F28335示波器设计的关键是利用TMS320F28335数字信号处理器的强大计算能力和丰富的外设资源,实现数据采集和信号处理功能。 首先,示波器的设计需要利用TMS320F28335的ADC(模数转换器)模块实现对信号的采集。通过配置ADC参数,可以选择合适的采样率和分辨率,确保对输入信号进行高质量的采样。 其次,示波器需要使用TMS320F28335的DMA(直接内存存取)控制器将采集到的数据传输到内存中。DMA可以实现高速数据传输,减轻CPU负担,确保实时性要求。同时,也可以使用DMA实现多通道采集,便于同时观测多个信号。 接下来,示波器需要利用TMS320F28335的处理器核心进行信号处理。首先,需要对采集到的数据进行预处理,例如去除噪声、滤波等,提高信号质量。然后,可以利用TMS320F28335的计算能力进行多种信号处理算法的实现,例如FFT(快速傅里叶变换)、卷积、相关等,以实现频谱分析、滤波、相关分析等功能。 最后,示波器需要通过TMS320F28335的外设接口(例如UART、SPI等)将处理后的数据传输到外部设备,如PC上的显示软件、存储设备等,以便进行数据的显示和分析。 综上所述,基于TMS320F28335示波器的设计需要充分发挥其计算和外设资源的优势,实现数据采集、信号处理和数据传输等功能。通过合理配置和优化设计,可以设计出高性能、高精度的示波器系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值