设计
请帮助我检查以下代码,我的问题是 IF3数据无法与 IF2同步!
#include "all_header.h"
#include "system.h"
#include "EMIF.h"
#include "errata_SSWF021_45.h"
#include "etpwm.h"
#include "sys_dma.h"
#include "reg_etpwm.h"
#include
#include
静态 uint32_t Received_ID;/*SD_20210119*/
静态 UINT32 DMA_Comp_Flag;
g_dmaCTRL g_dmaCTRLPKT;/*DMA 控制数据包配置堆栈*/
#define D_COUNT 8.
#define D_SIZE 8
int 数据;
uint32 cnt = 0;
uint32错误= 0;
uint32 TX_DONE = 0;
uint32 CPUCount = 0;
uint32 timer0=0;
uint8_t TX_data1[D_count]={1、2、3、4、4、4、 3、2、1};/*系统 ram*/中的传输缓冲区
uint8_t TX_data2[D_count]={1、3、5、7、9、 11、13、15};
uint8_t TX_data3[D_count]={2、4、6、8、10、 12、14、16};
uint8_t rx_data[D_count]={0};
uint8_t rx_data1[D_count]={0};/*系统 ram*/中的接收缓冲区
uint8_t rx_data2[D_count]={0};
uint8_t rx_data3[D_count]={0};
空延迟(uint32时间);
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
uint32 checkPackets (uint8 * src_packet、uint8 * dst_packet、uint32 psize);
void dmaGroupA 通知(dmaInterrupt_t inttype、uint32通道)
{
DMA_Comp_Flag = 0x5555AAAA;
}
空延迟(uint32时间)
{
int i;
对于(i = 0;i <时间;i++)
;
}
void main (void)
{
_enable_interrupt_();/*在 ARM CPSR 寄存器中启用 IRQ 中断*/
DMA_Comp_Flag = 0xAAAA5555;//重置标志*
rtiInit();
rtiEnableNotification (rtiNOTIFICATION_COMPARE0);
// rtiDisableNotification (rtiNOTIFICATION_COMPARE0);
_enable_IRQ ();
rtiStartCounter (rtiCOUNTER_BLOCK0);
u8gv_tmr_addr = get_tmr_addr ();
canInit();/*初始化 CAN*/
vimInit();
canREG1->CTL |=(UINT32)(1<<18);/*为 IF1*/启用 DMA DE1
canREG1->CTL |=(UINT32)(1<<19);/*为 IF2*/启用 DMA DE2
CANREG1->CTL |=(UINT32)(1<<20);/*启用 CTL 寄存器中的 DE3位以在 IF3接收数据时触发 DMA */
canREG1->IF3OBS = 0x0000001AU;//读取 ARB、数据 A 和 B - 8字节*/
canREG1->IF3UEy[0]= 0x0000002AU;/*配置为自动更新的 RX 2、4、6的消息框*/
/*- DMA 配置*/
dmaEnable();//启用 DMA */
// dmaEnableInterrupt (DMA_CH16、FTC);//在接收数据后启用中断*/
dmaEnableInterrupt (DMA_CH0、FTC);
// dmaReqAssign (DMA_CH2、17);/* DMA 配置和启用 DMA:DCAN1 IF1对应DMAREQ [17]*/
// dmaReqAssign (DMA_CH1、6);/*DCAN1 IF2对应DMAREQ [6]*/
dmaReqAssign (DMA_CH0、16);/*DCAN1 IF3对应请求线DMAREQ [16]*/
// canEnabableeloopback (canREG1、Internal_LBK);
/*-填充 DMA 控制数据包结构*/
/*源地址= IF3数据寄存器
*目标=系统 RAM 中的接收缓冲器
*长度= 1 (64位= 8 * 8字节)
*
// dmaConfigCtrlRxPacket ((uint32)(&TX_data2)、(uint32)(&(canREG1->IF1DATx[0]))、1);
dmaConfigCtrlRxPacket ((uint32)(&(canREG1->IF3DATx[0]))、(uint32)(&Rx_data2)、1);
// dmaConfigCtrlRxPacket ((uint32)(&Rx_data2)、(uint32)(&(canREG1->IF2DATx[0]))、1);
dmaSetCtrlPacket (dma_ch0、g_dmaCTRLPKT);/*设置用于传输的 DMA 控制包*/
// dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT);
// dmaSetCtrlPacket (dma_ch2、g_dmaCTRLPKT);
dmaSetChEnable (DMA_CH0、DMA_SW);/* CH0使能,IF1填充数据*/
// dmaSetChEnable (DMA_CH1、DMA_SW);
#if 1.
while (1)
{
// printf ("can tx\n");
延迟(100000);
DMA_Comp_Flag = 0xAAAA5555;//重置标志*
canTransmit (canREG1、canMESSAGE_box3、(const uint8 *)&TX_data2[0]);//在 CAN1上传输*
// canIsTxMessagePending (canREG1、canMESSAGE_box3);
CPUCount = canIsTxMessagePending (canREG1、canMESSAGE_box3);
// can1LowLevelInterrupt ();
// can1HighLevelInterrupt ();
while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX4))
;
dmaFTCAInterrupt();
while (dma_Comp_Flag!= 0x5555AAAA);//等待 DMA 中断 ISR 设置 Flag *
canGetData (canREG1、canMESSAGE_BOX4、(uint8 *)&Rx_DATA[0]);// CAN1上的接收*/
Received_ID =(canREG1->IF3ARB & 0x1FFC0000">18;
}
#endif
返回0;
}
void canMessageNotification (canBASE-t *节点、uint32_t MessageBox)
{
while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX4))
;
canGetData (canREG1、canMESSAGE_BOX4、(uint8 *)&Rx_DATA[0]);
Received_ID =(canREG1->IF3ARB & 0x1FFC0000">18;
/*
switch (Rx_DATA[0])
{
案例13:
数据=(Rx_DATA[1]- 0x30)* 1000 +(Rx_DATA[2]- 0x30)* 100 +(Rx_DATA[3]-0x30)* 10 + Rx_DATA[4]- 0x30;
数据*= 1.25;
中断;
默认值:
中断;
}
etpwmREG1->CMPA =数据;
memset (rx_data、0、sizeof (rx_data));
数据= 0;
*
}
#pragma weak (rtiNotification)
void rtiNotification (uint32通知)
{
/*重置标志*/
timer0 ++;
}
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT.Sadd =添加;//源地址*/
G_dmaCTRLPKT.DADD =添加;/*目标地址*/
G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
G_dmaCTRLPKT.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT.ELCNT = dsize;/*元素计数*/
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素源偏移*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧源偏移*
G_dmaCTRLPKT.PORTASGN = 4;/*端口 b *
G_dmaCTRLPKT.RDSIZE = ACCESS_64_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_64_BIT;/*写入大小*
G_dmaCTRLPKT.tType = FRAME_TRANSFSION;/* TRANSFSION TYPE 一个请求触发一帧传输*
G_dmaCTRLPKT.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_ON;/*自动初始化*/
}
/*用户代码结束*/