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.
#include "Board_GlobalPrototypes.h"
#include "DSP28x_Project.h"
#include "bsp_SpiaADS1255.h"
void bsp_Ads1255Init(void);//ADS1255初始化;
Uint16 ads1255Status[4] = {0,0,0,0};
Uint32 ads1255Data;
//SPI-ADC外设配置
void bsp_SpiaAds1255Init(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (SPICLKA)
// GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Enable pull-up on GPIO57 (SPISTEA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO57 (SPISTEA)
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
// GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // Configure GPIO57 as SPISTEA
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0;// STEA
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;//output;
//配置外部输入中断
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;//DRDY-AD
GpioCtrlRegs.GPADIR.bit.GPIO6 = 0;//input;
GpioCtrlRegs.GPAQSEL1.bit.GPIO6 = 1;//
GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL= 6;//GPIO6被配置为XINT外部中断2
XIntruptRegs.XINT2CR.bit.POLARITY = 0;//外部中断2设置为下降沿触发
GpioCtrlRegs.GPBPUD.bit.GPIO52 = 0;// AYNC-AD
GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO52 = 1;//output;
GpioCtrlRegs.GPBPUD.bit.GPIO44 = 0;// RESET-AD
GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO44 = 1;// output;
BSP_ADC_STEA_DIS; //SPI Select Disable
SpiaRegs.SPICCR.all = 0x0007;
SpiaRegs.SPICTL.all = 0x0007;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//1h (R/W) = SPICLK signal delayed by one half-cycle. Polarity
SpiaRegs.SPIBRR = 4;
SpiaRegs.SPICCR.all = 0x0087;
SpiaRegs.SPIPRI.bit.FREE = 1;//1h (R/W) = Free run, continue SPI operation regardless of suspend or when the suspend occurred.
GpioDataRegs.GPBSET.bit.GPIO44 = 1; // Disable Reset AD
GpioDataRegs.GPBSET.bit.GPIO52 = 1; // Enable AYNC 同步信号置高电平
EDIS;
bsp_Ads1255Init();
}
Uint16 bsp_SpiaXmit(Uint16 data){
SpiaRegs.SPITXBUF = data;
while(SpiaRegs.SPISTS.bit.INT_FLAG != 1);
return SpiaRegs.SPIRXBUF;
}
void bsp_Ads1255Init(void)//ADS1255初始化;
{
Uint16 temp = 0;
BSP_ADC_STEA_EN;
//SPI->0XFE; RESET, Reset to Power-Up Values
temp = bsp_SpiaXmit(0xFE00);
DELAY_US(2000);
//SPI->0X50; WREG,Write to REG 0X00写寄存器,从0x00开始写;
temp = bsp_SpiaXmit(0x5000);
DELAY_US(10);
//SPI->0X03; 写寄存器的个数,= 3+1;
temp = bsp_SpiaXmit(0x0300);
DELAY_US(10);
//SPI->0X04; 写寄存器0:STATUS,这是工作状态:
//BIT3:ORDER=0,MSB;BIT2:ACAL=1,Auto-Calibration;BIT1=0:BUFFEN,buffer disable;
temp = bsp_SpiaXmit(0x0400);
DELAY_US(10);
//SPI->0X01;MUX寄存器;模拟正输入端选择AIN0,模拟负输入端选择AIN1;
temp = bsp_SpiaXmit(0x0100);
DELAY_US(10);
// SPI->0X00;ADCON,AD转换控制:CLOCK Out off;Sensor detect off;PGA = 1;
temp = bsp_SpiaXmit(0x0000);
DELAY_US(10);
//SPI->0X92;1001 0010;DRATE,A/D data rate,500 SPS;
temp = bsp_SpiaXmit(0x9200);
DELAY_US(1000);
//SPI->0XFC;SYNC,同步AD转换;
temp = bsp_SpiaXmit(0xFC00);
DELAY_US(1000);
//SPI->0XFF;WAKEUP;完成同步并且推出待机模式;
temp = bsp_SpiaXmit(0xFF00);
DELAY_US(1000);
//--------------读取寄存器数据,看是否有问题-----------------
temp = bsp_SpiaXmit(0x1000);//读寄存器,从0x0000开始;
DELAY_US(1000);
temp = bsp_SpiaXmit(0x0300); //连续读取3+1=4个寄存器的值;
DELAY_US(1000);
ads1255Status[0] = bsp_SpiaXmit(0x0000);//
DELAY_US(1000);
ads1255Status[1] = bsp_SpiaXmit(0x0000);//
DELAY_US(1000);
ads1255Status[2] = bsp_SpiaXmit(0x0000);//
DELAY_US(1000);
ads1255Status[3] = bsp_SpiaXmit(0x0000);//
DELAY_US(1000);
//------------------------------------
// SPI->0XFD;STANBY;进入待机模式;
temp = bsp_SpiaXmit(0xFD00);
DELAY_US(1000);
// SPI->0XF0;SELFCAL;误差和增益自动校准;
temp = bsp_SpiaXmit(0xF000);
DELAY_US(1000);
BSP_ADC_STEA_DIS;
DELAY_US(10000); // 这里至少要保证3.6ms
}
void bsp_SpiaAds1255_SetBGA(Uint16 bga)//设置增益值;
{
Uint16 temp = 0;
BSP_ADC_STEA_EN;
////2. Set Register 写控制的寄存器
temp = bsp_SpiaXmit(0x5200);
DELAY_US(10);
//要写的寄存器的个数
temp = bsp_SpiaXmit(0x0000);
DELAY_US(10);
if(bga == 1)
{
temp = bsp_SpiaXmit(0x0000);// 增益为1
}
else if(bga == 2)
{
temp = bsp_SpiaXmit(0x0100);// 增益为2
}
else if(bga == 4)
{
temp = bsp_SpiaXmit(0x0200);// 增益为4
}
else
{
temp = bsp_SpiaXmit(0x0000);// 增益为1
}
DELAY_US(10);
// 由于以上只要SPI的线上有时钟,就会惊醒,所以要保证one-shot模式,还是需要再一次进入stand-by模式
temp = bsp_SpiaXmit(0xFD00);//3. StandBy 模式
DELAY_US(10);
BSP_ADC_STEA_DIS;
}
void bsp_SpiaAds1255_OneShotSet(void)//配置一次数据转换;
{
Uint16 temp;
BSP_ADC_STEA_EN;
temp = bsp_SpiaXmit(0xFF00);//5. week up
BSP_ADC_STEA_DIS;
EALLOW;
XIntruptRegs.XINT2CR.bit.ENABLE = 1; // 外部中断2使能
EDIS;
}
Uint32 bsp_SpiaAds1255_ReadData(void)//读取数据;
{
Uint32 temp1 = 0;
Uint32 temp2 = 0;
BSP_ADC_STEA_EN;
SpiaRegs.SPITXBUF = 0x0100; //读取指令
while (SpiaRegs.SPISTS.bit.INT_FLAG != 1); //判断是否发送完
SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF; //清中断符号
DELAY_US(10);
SpiaRegs.SPITXBUF = 0x0000;
while (SpiaRegs.SPISTS.bit.INT_FLAG != 1); //判断是否发送完
temp1 = SpiaRegs.SPIRXBUF; //清中断符号
temp2 |= ((temp1 << 16) & 0x00FF0000);
DELAY_US(10);
SpiaRegs.SPITXBUF = 0x0000;
while (SpiaRegs.SPISTS.bit.INT_FLAG != 1); //判断是否发送完
temp1 = SpiaRegs.SPIRXBUF; //清中断符号
temp2 |= ((temp1 << 8) & 0x0000FF00);
DELAY_US(10);
SpiaRegs.SPITXBUF = 0x0000;
while (SpiaRegs.SPISTS.bit.INT_FLAG != 1); //判断是否发送完
temp1 = SpiaRegs.SPIRXBUF; //清中断符号
temp2 |= (temp1 & 0x000000FF);
DELAY_US(10);
// 因为是One-Shot模式,所以每次读取完毕后就进入StandBy模式
SpiaRegs.SPITXBUF = 0xFD00;//3. StandBy 模式
while (SpiaRegs.SPISTS.bit.INT_FLAG != 1); //判断是否发送完
SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF; //清中断符号
DELAY_US(100);
BSP_ADC_STEA_DIS;
return temp2;
}
Void Xint2ISR(Void) //外部中断2服务函数
{
ads1255Data=bsp_SpiaAds1255_ReadData();
}
您好,
无法正常运行的表现是什么,这段代码看似是ADS1255的SPI驱动,是MCU无法发送SPI信号,还是ADC没反馈?
ADS1255的驱动代码及寄存器配置请参考ADS1256-C-EXAMPLE-CODE 支持软件 | 德州仪器 TI.com.cn
对于SPI驱动,请参考c2000ware中的示例c28,
也请用示波器实际监测一下SPI所有信号的波形。