//########################################################################### /* * DSP28335驱动ADS1278程序修改日志,刘旭 * ******************************************************************************* *中断函数配置出错,收获与修改 *1、GPIO0~31只用于INT1和INT2,INT3~7才用GPIO32~63,但是在配置时用X-32进行选择 *2、外部中断3是第12组CPU中断第1号,清除中断标志位用 PieCtrlRegs.PIEACK.all = PIEACK_GROUP12; * *2016-1-26 ******************************************************************************* *SPI配置出错 *1、主机模式没有发送虚拟数据,所以无法接收 * *2016-1-27 ************************************************************************************ * *1、SYNC在退出中断时重启,可以接收变化的数据,但是数据仍然不正确 *2、通过赋值虚拟发送0X5A00,接收8位数据反复覆盖,读取,读数成功,问题在于没有连续 * *2016-1-28 ************************************************************************************** * * */ // Original Source by S.D. // // $TI Release: 2833x/2823x Header Files and Peripheral Examples V133 $ // $Release Date: June 8, 2012 $ //########################################################################### #include "DSP28x_Project.h" // Device Headerfile and Examples Include File #include "DSP2833x_Examples.h"//包含DELAY_US(A) void spi_fifo_init(void); void ADS1278_GPIO_INIT(void); void ADS1278_MODESET(Uint16 MODE1,Uint16 MODE0 ); void ADS1278_INIT(void); void ADS1278_BIGIN(void); /************************************外部ADS1278_nDRDY下降沿中断函数***************************/ interrupt void ADS1278_nDRDY_isr(void); /*****************************ADS1278控制引脚定义**************************************/ #define ADS1278_5v_EN GPIO20 #define ADS1278_nSYNC GPIO48 #define ADS1278_nDRDY GPIO49 #define ADS1278_VCOM GPIO50 #define ADS1278_MODE0 GPIO51 #define ADS1278_MODE1 GPIO52 #define ADS1278_1V8_3V3_EN GPIO53 /* * ADS1278配置步骤 * 1、ADS1278相关引脚初始化 * 其中ADS1278_nDRDY配置为外部中断下降延触发,注意在中断函数结束时清除标志位 * 其他引脚配置为输出IO * 2、模式设定,先设置低功耗模式MODE1:MODE0=1:0 * 3、把nSYNC拉低停止处理 * 4、先后上电ADS1278_1V8_3V3_EN置1,然后ADS1278_5v_EN置1 * 5、设置外部中断,捕获ADS1278_nDRDY下降沿中断 * 6、删除现有的中断接收函数,配置中断处理函数及位域接收结构体 * 7、启动转换ADS1278_nSYNC先拉低,大于10u后拉高 */ /*************************************全局变量******************************************/ #define wide 48 int16 Xint1Count=0;//接收计数 Uint32 AD_Value[6][256]={0};//接收缓存 unsigned char rdata[wide]={0};//测试接收 Uint16 tdata=0x0000;//测试发送 /************************************6、删除现有的中断接收函数,配置中断处理函数及位域接收结构体**************/ union { int32 all; struct { int32 rev:8; int32 High:8; int32 Mid:8; int32 Low:8; }Half; struct { int32 rev:8; int32 HighBit0:1; int32 rev2:15; int32 Low8:8; }Half1; }Value; void main(void) { // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP2833x_SysCtrl.c file. InitSysCtrl(); // Step 2. Initalize GPIO: // This example function is found in the DSP2833x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio(); // Skipped for this example // Setup only the GP I/O only for SPI-A functionality InitSpiaGpio(); // Step 3. Initialize PIE vector table: // Disable and clear all CPU interrupts DINT; IER = 0x0000; IFR = 0x0000; // Initialize PIE control registers to their default state: // This function is found in the DSP2833x_PieCtrl.c file. InitPieCtrl(); // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP2833x_DefaultIsr.c. // This function is found in DSP2833x_PieVect.c. InitPieVectTable(); // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. EALLOW; PieVectTable.XINT3 = &ADS1278_nDRDY_isr; EDIS; // Step 4. Initialize all the Device Peripherals: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals(); // Not required for this example spi_fifo_init(); // Initialize the SPI only // Step 5. User specific code, enable interrupts: // Enable interrupts required for this example /************************配置中断向量************************************/ PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block PieCtrlRegs.PIEIER12.bit.INTx1 = 1; // 第12组1号 IER |= M_INT12; // 使能第12组中断 EINT; // 使能全局中断 //进入循环之前的初始化 /* * ADS1278配置步骤 * 1、ADS1278相关引脚初始化 * 其中ADS1278_nDRDY配置为外部中断下降延触发,注意在中断函数结束时清除标志位 * 其他引脚配置为输出IO * 2、模式设定,先设置低功耗模式MODE1:MODE0=1:0 * 3、把nSYNC拉低停止处理 * 4、先后上电ADS1278_1V8_3V3_EN置1,然后ADS1278_5v_EN置1 * 5、设置外部中断,捕获ADS1278_nDRDY下降沿中断 * 6、删除现有的中断接收函数,配置中断处理函数及位域接收结构体 * 7、启动转换ADS1278_nSYNC先拉低,大于10u后拉高 */ ADS1278_GPIO_INIT(); ADS1278_MODESET(0,1);//高精度模式 ADS1278_INIT(); ADS1278_BIGIN(); // Step 6.死循环 for(;;) { // ADS1278_BIGIN();//同步开始转化 } } void spi_fifo_init() { // Initialize SPI FIFO registers SpiaRegs.SPICCR.bit.SPISWRESET=0; // 软件复位SPI SpiaRegs.SPICCR.all=0x0087;//11000111字符长度8,禁止回送模式,SPI配置控制寄存器 ,低8位00000111,一个字长=SPICHAR+1 SpiaRegs.SPICTL.all=0x0006;//运行控制寄存器(低8位00000110),溢出中断使能,无延迟,主机模式,使能发送,使能中断 // SpiaRegs.SPISTS.all=0x0000;//SPI状态寄存器 SpiaRegs.SPIBRR=0x0003; // SPI波特率寄存器00000011,3,SPI波特率=150/4*(3+1)=6.75MHz /* SpiaRegs.SPIFFTX.all=0xC028; // 1100000000101000发送寄存器 SpiaRegs.SPIFFRX.all=0x0028; // 0000000000101000接受寄存器 SpiaRegs.SPIFFCT.all=0x00; //FIFO控制寄存器 */ SpiaRegs.SPIFFTX.all=0xE040;//FIFO发送寄存器 SpiaRegs.SPIFFRX.all=0x204f;//接收寄存器 SpiaRegs.SPIFFCT.all=0x0;//FIFO控制寄存器 SpiaRegs.SPIPRI.all=0x0010; //优先级寄存器 SpiaRegs.SPICCR.bit.SPISWRESET=1; // 使能 SPI // SpiaRegs.SPIPRI.bit.FREE = 1;//优先级控制寄存器的一位,和上面那一句等效 SpiaRegs.SPIFFTX.bit.TXFIFO=1; SpiaRegs.SPIFFRX.bit.RXFIFORESET=1; } /***********************************ADS1278引脚初始化函数******************************/ void ADS1278_GPIO_INIT(void) { /* 1、ADS1278相关引脚初始化 * 其中ADS1278_nDRDY配置为外部中断下降延触发,注意在中断函数结束时清除标志位 * 其他引脚配置为输出IO * */ EALLOW; GpioDataRegs.GPACLEAR.bit.ADS1278_5v_EN = 1; GpioDataRegs.GPBCLEAR.bit.ADS1278_nSYNC = 1; GpioDataRegs.GPBCLEAR.bit.ADS1278_VCOM = 1; GpioDataRegs.GPBCLEAR.bit.ADS1278_MODE0 = 1; GpioDataRegs.GPBCLEAR.bit.ADS1278_MODE1 = 1; GpioDataRegs.GPBCLEAR.bit.ADS1278_1V8_3V3_EN = 1; GpioCtrlRegs.GPAMUX2.bit.ADS1278_5v_EN = 0; GpioCtrlRegs.GPBMUX2.bit.ADS1278_nSYNC = 0; GpioCtrlRegs.GPBMUX2.bit.ADS1278_VCOM = 0; GpioCtrlRegs.GPBMUX2.bit.ADS1278_MODE0 = 0; GpioCtrlRegs.GPBMUX2.bit.ADS1278_MODE1 = 0; GpioCtrlRegs.GPBMUX2.bit.ADS1278_1V8_3V3_EN = 0; GpioCtrlRegs.GPADIR.bit.ADS1278_5v_EN = 1; GpioCtrlRegs.GPBDIR.bit.ADS1278_nSYNC = 1; GpioCtrlRegs.GPBDIR.bit.ADS1278_VCOM = 1; GpioCtrlRegs.GPBDIR.bit.ADS1278_MODE0 = 1; GpioCtrlRegs.GPBDIR.bit.ADS1278_MODE1 = 1; GpioCtrlRegs.GPBDIR.bit.ADS1278_1V8_3V3_EN = 1; EDIS; // ADS1278_nDRDY 外部中断配置,INT3 EALLOW; GpioCtrlRegs.GPBMUX2.bit.ADS1278_nDRDY = 0; // GPIO GpioCtrlRegs.GPBDIR.bit.ADS1278_nDRDY = 0; // input GpioCtrlRegs.GPBQSEL2.bit.ADS1278_nDRDY = 0; // Xint1 Synch to SYSCLKOUT only GpioCtrlRegs.GPBCTRL.bit.QUALPRD0 = 0xFF; // Each sampling window is 510*SYSCLKOUT EDIS; // GPIO49 is XINT1 EALLOW; GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 17; // Xint3 is GPIO49,49-32=17 EDIS; // Configure XINT1 XIntruptRegs.XINT3CR.bit.POLARITY = 0; // Falling edge interrupt下降沿触发 // Enable XINT1 and XINT2 XIntruptRegs.XINT3CR.bit.ENABLE = 1; // Enable Xint1 } /***************************************模式设定函数ADS1278_MODESET****************************/ void ADS1278_MODESET(Uint16 MODE1,Uint16 MODE0 ) { /* 2、模式设定,先设置低功耗模式MODE1:MODE0=1:0*/ GpioDataRegs.GPBDAT.bit.ADS1278_MODE1 = MODE1; GpioDataRegs.GPBDAT.bit.ADS1278_MODE0 = MODE0; } /************************************拉低ADS1278_nSYNC与上电***************************/ void ADS1278_INIT(void) { /* 3、把nSYNC拉低停止处理 * 4、先后上电ADS1278_1V8_3V3_EN置1,然后ADS1278_5v_EN置1 */ GpioDataRegs.GPBDAT.bit.ADS1278_nSYNC = 0; GpioDataRegs.GPBDAT.bit.ADS1278_1V8_3V3_EN = 1; DELAY_US(1);//延时1us // delay_loop(); GpioDataRegs.GPADAT.bit.ADS1278_5v_EN = 1; } /*************************************启动ADS1278转换函数*****************************/ void ADS1278_BIGIN(void) { /*7、启动转换ADS1278_nSYNC先拉低,大于10u后拉高*/ GpioDataRegs.GPBDAT.bit.ADS1278_nSYNC = 0; DELAY_US(1);//延时1us // delay_loop(); GpioDataRegs.GPBDAT.bit.ADS1278_nSYNC = 1; DELAY_US(5000);//5ms // delay_loop(); } interrupt void ADS1278_nDRDY_isr(void)//中断处理函数 { //先停止数据转化,在读取数据,出中断时再开始 // GpioDataRegs.GPBDAT.bit.ADS1278_nSYNC = 0; // SpiaRegs.SPICTL.bit.TALK = 0; // 禁止发送功能,网上的 // Value.Half.High=SpiaRegs.SPIRXBUF; // Value.Half.Mid=SpiaRegs.SPIRXBUF; // Value.Half.Low=SpiaRegs.SPIRXBUF; // Value.Half1.High16=SpiaRegs.SPIRXBUF; // Value.Half1.Low8=SpiaRegs.SPIRXBUF; // AD_Value[Xint1Count]=Value.all; // Value.all=0x00000000; /* AD_Value[Xint1Count]=SpiaRegs.SPIRXBUF; AD_Value[Xint1Count]<<=8; AD_Value[Xint1Count]=SpiaRegs.SPIRXBUF; AD_Value[Xint1Count]<<=8; AD_Value[Xint1Count]=SpiaRegs.SPIRXBUF; */ int i; for(i=0;i