|
我用的是PIC24HJ256GP610A,下了官方的CAN通讯例程,改完之后就是通讯不了,光发送都是不成功的,想请教各位有没有成功的例程可以借我参考一下,谢谢了。
#include "p24Hxxxx.h"
#include "Uart.h"
#include "ECAN1Config.h"
/* Dma Initialization for ECAN1 Transmission */
void Dma0_init(void)
{
DMACS0=0; // 为 ECAN 发送初始化 DMA 通道 0 并清零冲突标志
DMA0CON=0x2020; // 设置通道 0 工作在外设间接寻址模式、正常操作、字操作,并选择发送到外设
DMA0PAD=0x0442; // 设置外设 ECAN1 ( C1TXD)的地址.
DMA0CNT=0x0007; // 设置数据块传输大小为 8.
DMA0REQ=0x0046; // 按照 DMA 请求自动启动 DMA 发送.
DMA0STA= __builtin_dmaoffset(ecan1msgBuf);
DMA0CONbits.CHEN=1;// 使能通道
}
/* Dma Initialization for ECAN1 Reception */
/*
void Dma2_init(void)
{
DMACS0=0; // 为 ECAN 接收初始化 DMA 通道 2 并清零冲突标志
DMA2CON=0x0020; // 设置通道 2 工作在外设间接寻址模式、正常操作、字操作,并选择从外设接收
DMA2PAD=0x0440; // 设置外设 ECAN1 ( C1RXD)的地址
DMA2CNT=0x0007; // 设置数据块传输大小为 8
DMA2REQ=0x0022; // 按照 DMA 请求自动启动 DMA 发送
DMA2STA= __builtin_dmaoffset(ecan1msgBuf);
DMA2CONbits.CHEN=1;// 使能通道
}
*/
void Ecan1_Inter(void)
{
IEC2bits.C1IE = 1;
C1INTEbits.TBIE = 1;
C1INTEbits.RBIE = 1;
}
void Ecan1_init(void)
{
long identifier_f,identifier_m,sid10_0=0, eid15_0=0, eid17_16=0;
TRISF |= 1;
TRISF &= ~0x2 ;
Dma0_init();
/* 请求配置模式 */
C1CTRL1bits.REQOP=4;
while (C1CTRL1bits.OPMODE!=4);
/* 配置波特率 位时间=( 同步段 + 传播延时 + 相位缓冲段 1 + 相位缓冲段 2) =8*TQ */
/* 相位缓冲段1=3TQ 相位缓冲段2=3TQ 传播延时=1TQ 同步段=1TQ 比特率为 500kbps */
C1CTRL1bits.CANCKS = 1; // FCAN 选择为 FCY FCAN = FCY = 8 MHz
C1CFG1bits.BRP = 0; // TQ = 2 x 1 x 1/FCAN
C1CFG1bits.SJW = 0; //同步跳转宽度设置为 1 TQ
C1CFG2bits.SEG1PH = 2; //相位缓冲段 1 的时间为 3 TQ
C1CFG2bits.SEG2PHTS = 1; //相位缓冲段 2 的时间设置为可编程
C1CFG2bits.SEG2PH = 2; //相位缓冲段 2 的时间为 3 TQ
C1CFG2bits.PRSEG = 0; //传播时间段的时间为 1 TQ
C1CFG2bits.SAM = 0; //在该采样点采样总线一次
C1FCTRLbits.DMABS=0b000; // DMA RAM 中的 4 个缓冲区
/*过滤器与屏蔽器配置,过滤器 0 ,F_ID = ,缓冲区 1 ,屏蔽器 0 , M_ID = */
//Acceptance Filter "n"
identifier_f = 0;
eid15_0 = (identifier_f & 0xFFFF);
eid17_16= (identifier_f>>16) & 0x3;
sid10_0 = (identifier_f>>18) & 0x7FF;
C1CTRL1bits.WIN=1;
C1RXF0SID=(((sid10_0)<<5) + 0x8) + eid17_16;
C1RXF0EID=eid15_0;
C1BUFPNT1bits.F0BP=0x1; //满足条件将接收到缓冲区1
C1FMSKSEL1bits.F0MSK=0x0; //接收屏蔽寄存器 0 包含屏蔽值
C1FEN1bits.FLTEN0=0x1; // 使能过滤器0 来接收报文
C1CTRL1bits.WIN=0;
//Acceptance Filter Mask "m"
identifier_m = 0;
eid15_0 = (identifier_m & 0xFFFF);
eid17_16= (identifier_m>>16) & 0x3;
sid10_0 = (identifier_m>>18) & 0x7FF;
C1CTRL1bits.WIN=1;
C1RXM0SID=(((sid10_0)<<5) + 0x8) + eid17_16;
C1RXM0EID=eid15_0;
C1CTRL1bits.WIN=0;
/* 请求正常工作模式 */
C1CTRL1bits.REQOP=0;
while(C1CTRL1bits.OPMODE!=0);
/* ECAN1 发送/接收信息配置 */
C1RXFUL1=C1RXFUL2=C1RXOVF1=C1RXOVF2=0x0000;
C1TR01CONbits.TXEN0=1; /* ECAN1, Buffer 0 is a Transmit Buffer */
C1TR01CONbits.TXEN1=0; /* ECAN1, Buffer 1 is a Receive Buffer */
C1TR01CONbits.TX0PRI=0b11; /* Message Buffer 0 Priority Level */
C1TR01CONbits.TX1PRI=0b11; /* Message Buffer 1 Priority Level */
Ecan1_Inter();
}
void ecan1WriteTxMsgBufId(long txIdentifier)
{
unsigned long word0=0, word1=0, word2=0;
unsigned long sid10_0=0, eid5_0=0, eid17_6=0;
eid5_0 = (txIdentifier & 0x3F);
eid17_6 = (txIdentifier>>6) & 0xFFF;
sid10_0 = (txIdentifier>>18) & 0x7FF;
word1 = eid17_6;
word0 = ((sid10_0 << 2) | 3);
word2 = (eid5_0 << 10);
ecan1msgBuf[0][0] = word0;
ecan1msgBuf[0][1] = word1;
ecan1msgBuf[0][2] = word2;
}
void ecan1WriteTxMsgBufData(unsigned int dataLength, unsigned int data1, unsigned int data2, unsigned int data3, unsigned int data4)
{
ecan1msgBuf[0][2] = (ecan1msgBuf[0][2] & 0xfff0 )+dataLength;
ecan1msgBuf[0][3] = data1;
ecan1msgBuf[0][4] = data2;
ecan1msgBuf[0][5] = data3;
ecan1msgBuf[0][6] = data4;
}
int main(void)
{
clearIntrflags();
Port_init();
Uart1_init();
Ecan1_init();
while(1)
{
ecan1WriteMessage();
// C1TR01CONbits.TXREQ0=1;
if(KEY==0)
{
delay(150);
if(KEY==0)
{
LED1=~LED1;C1TR01CONbits.TXREQ0=1;
while(!KEY);
}
}
}
|
|