大家好!采用DSP28335通过XINT与CPLD通讯,在通讯过程中发现,DSP在向定义的地址写入数据时,所有地址都有数据,什么原因?下面是配置的完整代码
#include "DSP2833x_Device.h" // DSP2833x芯片设备头文件 #include "DSP2833x_Examples.h" // DSP2833x示例代码文件 // 定义控制 LED 的宏 #define LED1_ON GpioDataRegs.GPASET.bit.GPIO2 = 1 // 点亮 LED1 #define LED1_OFF GpioDataRegs.GPACLEAR.bit.GPIO2 = 1 // 熄灭 LED1 #define LED2_ON GpioDataRegs.GPASET.bit.GPIO1 = 1 // 点亮 LED2 #define LED2_OFF GpioDataRegs.GPACLEAR.bit.GPIO1 = 1 // 熄灭 LED2 // //// 定义外设地址 //#define ExRamStart 0X4000 // 区域 0 起始地址 //#define IntADD (*(volatile int16 *)(ExRamStart + 0x000B)) // 读取地址 //#define CntlsADD (*(volatile int16 *)(ExRamStart + 0x000C)) // 写入地址 1 //#define SentADD (*(volatile int16 *)(ExRamStart + 0x000F)) // 写入地址 2 //定义起始地址 Uint16 *ExRamStart = (Uint16 *)0x4000; // 外部RAM起始地址,16位数据存储 #define IntADD *(volatile Uint16 *)0x400B // 接收地址 #define IntADD1 *(volatile Uint16 *)0x400C // 接收地址 #define CntlsADD *(volatile Uint16 *)0x400D // 发送地址 #define SentADD *(volatile Uint16 *)0x400E // 发送地址 // 全局变量 volatile Uint16 sent_data = 0; volatile Uint16 sent_data1 = 0; volatile Uint16 received_data = 0; volatile Uint16 received_data1 = 0; #define MAX_HISTORY 16 // 定义历史数据的最大数量 volatile Uint16 history_data[MAX_HISTORY]; volatile Uint16 history_index = 0; // 函数声明 void configtestled(void); void init_zone0(void); void main(void) { // 初始化系统 InitSysCtrl(); init_zone0(); // 禁用所有中断 DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); // 配置 LED GPIO configtestled(); while (1) { // 写入数据到外设 CntlsADD = sent_data; SentADD = sent_data1; DELAY_US(100); // 确保写入操作稳定 // 从外设读取数据 received_data = IntADD; received_data1 = IntADD1; // 存储历史数据 history_data[history_index] = received_data; history_index = (history_index + 1) % MAX_HISTORY; // 根据数据状态控制 LED if (received_data == sent_data) { LED1_ON; LED2_ON; } else { LED1_OFF; LED2_OFF; } // 更新发送数据,循环变化 //sent_data = (sent_data + 1) & 0x000F; //sent_data1 = (sent_data1 + 1) & 0x00FF; sent_data = 0x000F; sent_data1 =0x000C; DELAY_US(1000); // 避免循环过快 } } // 配置 LED GPIO void configtestled(void) { EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; GpioDataRegs.GPACLEAR.bit.GPIO2 = 1; // 熄灭 LED1 GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; GpioDataRegs.GPACLEAR.bit.GPIO1 = 1; // 熄灭 LED2 EDIS; } // 初始化外部存储接口 void init_zone0(void) { InitXintf16Gpio(); EALLOW; XintfRegs.XINTCNF2.bit.XTIMCLK = 1; XintfRegs.XINTCNF2.bit.WRBUFF = 3; XintfRegs.XINTCNF2.bit.CLKOFF = 0; XintfRegs.XINTCNF2.bit.CLKMODE = 1; XintfRegs.XTIMING0.bit.XWRLEAD = 2; XintfRegs.XTIMING0.bit.XWRACTIVE = 3; XintfRegs.XTIMING0.bit.XWRTRAIL = 2; XintfRegs.XTIMING0.bit.XRDLEAD = 2; XintfRegs.XTIMING0.bit.XRDACTIVE = 3; XintfRegs.XTIMING0.bit.XRDTRAIL = 2; XintfRegs.XTIMING0.bit.X2TIMING = 0; XintfRegs.XTIMING0.bit.USEREADY = 0; XintfRegs.XTIMING0.bit.READYMODE = 1; XintfRegs.XTIMING0.bit.XSIZE = 3; EDIS; asm(" RPT #7 || NOP"); }