Thread 中讨论的其他器件:controlSUITE
尊敬的社区:
通过 UPP 总线从 Xilinx FPGA 接收数据时遇到问题。 我按照 第 18页 www.ti.com/.../sprugj5b.pdf 中的说明对协议进行了编程。
很遗憾、我找不到任何有关时序的信息。 该文件仅指出:
-"默认情况下、其他信号在时钟的上升沿对齐"
-"时钟的有效边沿应始终略早于其他 uPP 信号的转换。"
这是 FPGA 的仿真输出、具有时钟、启动、使能 (上图)和8位数据 (下图):
我正在尝试在1行和1窗口中传输8个字节的数据。 时钟频率为11MHz。
C2000上的代码基于针对 UPP 接收的 controlSUITE 示例。 如上所示实现协议后、控制器不会触发中断。 但是、在这之前、我尝试在时钟的下降沿对齐信号、从而能够生成 OOW (窗口结束)中断。
问题是、当我分析地址"uPP_RX_MSGRAM_ADDR"(0x6E00)处的存储器时、似乎我只接收到3个字节:D0、D2和 D4。
我现在的问题是:
- 当我使用 UPP 文档中规定的时间时、为什么我不会收到任何信息?
- 为什么 UPP 消息 RAM 中只有3个字节(从 byte_CNT 中指定的6个字节开始)并且它触发了 OOW 中断?
- "UppRegs.CHIDESC0 = 0x7000;"有何影响? 我希望传入的数据存储在该地址、但该存储器始终为空。
如果有任何建议,我会很感激!
此致、Josh
#include "F28x_Project.h" #include "F2837xS_upp_defines.h" // 定义 // #define LINE_CNT 1 #define byte_CNT 6 #define WIN_CNT 1 #define WIN_BYTE_CNT 6 #define WIN_WORD_CNT 3 // 全局 // volatile long int 勘误表= 0; volatile long int OOW_IN_cnt = 0; volatile long int EOL = 0; volatile long int Rdr = 0; volatile Copyint RxMsgRam = 0; volatile long Dt = 0xDt // GS0 RAM // 函数原型 // extern void InitUpp1Gpio (void); extern void SoftResetUpp (void); interrupt void local_UPPA_ISR (void); // // Main // void main (void) { int i; // 初始化系统控制 // InitSysCtrl (); //禁用 eCPU 中断/中断 IER = 0x0000; IFR = 0x0000; EDIS; InitPieVectTable (); EALLOW; PieVectTable.UPPA_INT =&LOCAL_UPPA_ISR; // //启用中断号8。 // IER = M_INT8; // //为 UPPA 中断启用中断。 // PieCtrlRegs.PIEIER8.bit.INTx15=1; // 启用 PIE 和 CPU 级别中断。 // EnableInterrupts(); // 清除用于存储传入数据包的 RAM。 // MemCfgRegs.GSxINIT.bit.init_GS0 = 1; while (MemCfgRegs.GSxINITDONE.bit.INITDONE_GS0 = 0){}; // 发出软复位至 uPP // 软复位(); InitGpio (INITDONE_GS0 = 0);// GPIO 设置93 (PINU1_LED) ;//输出 UPI_Pinux (GPIO_93);GPIO_Pin) GPIO_PushPull); // 初始化 UPP1 GPIO // InitUpp1Gpio (); GPIO_WritePin (93、0); // 为 RX 配置 uPP // UppRegs.ifcfg.bit.ENAA = 1; //使用使能信号 uppRegs.ifcfg.bit.STARTA = 1; //使用起始信号 //UppRegs.ifcfg.bit.waita = 1; UppRegs.CHCTL.bit.MODE = uPP_RX_MODE;//设置 RX。 UppRegs.CHCTL.bit.DRA = uPP_SDR; // SDR 模式 // //启用 EOL/EOW 中断 // UppRegs.INTENSET.EOLI = 1; UppRegs.INTENSET.EOWI = 1; UppRegs.GINTEN.BIN.GINTEN = 1; // 启用 uPP 模块 // UppRegs.bit.CESCR.EON.1 ;UppCLINESCR.EN.CLINESCn.BIT.BIT.USCMT= 1;// UCCNT_RINCR.INCR.INCR.ENTREN.ENTREN.INESCNT.INTREN.EN.EN.INTREN.BIT.1;// UCLINCR.INESCR.ENTRENTREN.INESCR.EN.IN.IN.INTRENTRENTREN.INTREN.IN.INTREN.IN.INTREN.IN.IN.EN.IN.IN.INTRENTRENTREN. if (CopyRxMsgRam = 1) { if (OOW_INT_cnt%2) { 对于(i = 0;i < win_word_CNT;i+=2) { RdValue =*(uint32 *)(uPP_RX_MSGRAM_ADDR + WIN_WORD_CNT + I); *(uint32 *) DstAddr = RdValue; DstAddr = DstAddr + 2; } } 其他 { 对于(i = 0;i < win_word_CNT;i+=2) { RdValue =*(uint32 *)(uPP_RX_MSGRAM_ADDR + WIN_WORD_CNT + I); *(uint32 *) DstAddr = RdValue; DstAddr = DstAddr + 2; } } CopyRxMsgRam = 0; } // //在预期的窗口计数完成后禁用 uPP 以停止传输。 // UppRegs.PERCTL.bit.PEREN = 0; // 发出软复位至 uPP。 这将复位 RX 状态机、但为了实现这一点、 //输入时钟(uPP_CLK)应保持运行。 //此处发出复位。 // SoftResetUpp (); RdValue = 0; asm (" ESTOP0"); for (;); } // // local_UPPA_ISR - UPPA 中断服务例程(ISR) // 中断 void local_UPPA_ISR (void) { int i; GPIO_WritePin (93、1); // 要接收来自此 PIE 组的更多中断,请确认 //此中断 // PieReg_WritePin (93、1);// PeglInpReg = 0xPegrg0=u.eRegs! (0xPegrgi+p0=u.u.eRegs) if (UppRegs.ENINTST.bit.EOWI = 0x1)//检查 OOW 中断标志 { OOW_INT_cnt++; CopyRxMsgRam = 1; // //启用 EOL 中断 // UppRegs.INTENSET.bit.EOLI = 1; // //清除 OOW 中断的状态 // UppRegs.ENINTST.ALL = uPP_INT_EOWI; IF (UppRegs.ENINTST.bit.EOWI!= 0) { ErrCount++; ASM (" ESTOP0"); } } if (UppRegs.ENINTST.bit.EOLI = 0x1)//检查 EOL 中断标志 { EOL _int_cnt++; // //清除状态和禁用 EOL 中断 // UppRegs.ENINTST.ALL = uPP_INT_EOLI; IF (UppRegs.ENINTST.bit.EOLI!= 0) { ErrCount++; ASM (" ESTOP0"); } UppRegs.INTENCLR.ALL = uPP_INT_EOLI; IF (UppRegs.INTENSET.bit.EOLI!= 0) { ErrCount++; ASM (" ESTOP0"); } // //初始化下一个窗口传输的通道描述符。 // if (OOW_INT_cnt < WIN_CNT) { if (OOW_INT_cnt%2) { if (CopyRxMsgRam = 1) { 对于(i = 0;i < win_word_CNT;i+=2) { RdValue =*(uint32 *)(uPP_RX_MSGRAM_ADDR + I); *(uint32 *) DstAddr = RdValue; DstAddr = DstAddr + 2; } CopyRxMsgRam = 0; } UppRegs.CHIDESC0 = 0x7000; UppRegs.CHIDESC1.bit.LCNT = LINE_CNT; UppRegs.CHIDESC1.bit.BCNT = BYTE_CNT; UppRegs.CHIDESC2.all = byte_CNT; } 其他 { if (CopyRxMsgRam = 1) { 对于(i = 0;i < win_word_CNT;i+=2) { RdValue =*(UINT32 *)(uPP_RX_MSGRAM_ADDR + win_word_CNT + i); *(uint32 *) DstAddr = RdValue; DstAddr = DstAddr + 2; } CopyRxMsgRam = 0; } UppRegs.CHIDESC0 = 0x7000 +(LINE_CNT * BYTE_CNT); UppRegs.CHIDESC1.bit.LCNT = LINE_CNT; UppRegs.CHIDESC1.bit.BCNT = BYTE_CNT; UppRegs.CHIDESC2.all = byte_CNT; } } // //清除全局中断。 // RdValue = UppRegs.ENINTST.ALL; UppRegs.GINTCLR.bit.GINTCLR = 1; if (UppRegs.GINTFlG.all!= 0x0) { ErrCount++; ASM (" ESTOP0"); } }