會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





P33EV256GM104 ECAN 發送問題
新會員
註冊日期:
2016/11/04 17:38
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 3
離線
各位好,我想請教P33EV256GM104 ECAN 發送問題,我這樣設定ECAN有那裡設定錯誤嗎
我的CANTX 一直只有一個START訊號就沒了
一直卡在 while (C1TR01CONbits.TXREQ0 == 1);這段程式
拜託各位高手指點小弟我

以下是我的程式碼


#include "P33EV256GM104.h"
#include "system.h"
#include "oled.h"

#define FCY 40000000
#define BAUDRATE 9600
#define BRGVAL ((FCY/BAUDRATE)/16)-1
/* CAN filter and mask defines */
/* Macro used to write filter/mask ID to Register CiRXMxSID and
CiRXFxSID. For example to setup the filter to accept a value of
0x123, the macro when called as CAN_FILTERMASK2REG_SID(0x123) will
write the register space to accept message with ID 0x123
USE FOR STANDARD MESSAGES ONLY */

#define NUM_OF_ECAN_BUFFERS 32
#define MSG_SID 0x123 // the arbitrary CAN SID of the transmitted message


volatile unsigned int ecan1MsgBuf[NUM_OF_ECAN_BUFFERS][8]
__attribute__((aligned(NUM_OF_ECAN_BUFFERS * 16)));

/* This is the ECAN message buffer declaration. For this example the message buffers are
placed in EDS memory. Note that for dsPIC33E ECAN message buffers can be placed anywhere in
Flash memory. Note the buffer alignment. */
/*__eds__ unsigned int ecan1MsgBuf[NUM_OF_ECAN_BUFFERS][8]
__attribute__((aligned(NUM_OF_ECAN_BUFFERS * 16)));*/


void LEDBlink(void);
void CAN_Transmit(void);
void UART_TX_Init(void);//配置发送
void UART_RX_Init(void);//配置发送
//延时
void Delay_1ms(unsigned int t)//t = 1000大概1s
{
unsigned int i,j;
for(i = 0;i < t;i ++)
for(j = 0;j < 2200;j ++);
}
//振荡器配置
void System_Colck(void)
{
// Configure oscillator to operate the device at 40 MHz
// Fosc = Fin * M/(N1 * N2), FCY = Fosc/2
// Fosc = 8M*40(2*2) = 80 MHz for 8M input clock
PLLFBD = 38; // M = 40
CLKDIVbits.PLLPOST = 0; // N1 = 2
CLKDIVbits.PLLPRE = 0; // N2 = 2
OSCTUN = 0; // Tune FRC oscillator, if FRC is used
RCONbits.SWDTEN = 0; // Disable Watchdog Timer
while (OSCCONbits.LOCK!= 1) {};
}
//系统初始化
void System_Init(void)
{
TRISB &= ~0xfc00;//RB10-RB15 清零
IOCON1 = 0x0000;//GPIO 模块控制 PWMxH PWMxL引脚
ANSELB = 0x0000;//数字引脚
ANSELC = 0x0000;//数字引脚
}
void CAN1_Init(void)
{
unsigned long address;
//RPOR5bits.RP49R = 0b001110;//RP42配置RP49为TX引脚 RC1
//RPINR18bits.U1RXR = 52;//将接收配置到RPI52 RC4
_TRISC1 = 0; //CANTX
_TRISC4 = 1; //CANRX
RPOR5bits.RP49R = 0x0E;//RP42配置RP49为TX引脚 RC1
RPINR18bits.U1RXR = 0x34;
/*RPINR26 = 0x34; // connect CAN RX to RPI52
RPOR5 = 0x000E; // connect CAN TX to RP97*/
C1CTRL1bits.REQOP = 4;

while (C1CTRL1bits.OPMODE != 4);
C1CTRL1bits.WIN = 0;

/* Set up the CAN module for 250kbps speed with 10 Tq per bit. */

C1CFG1 = 0x47; // BRP = 8 SJW = 2 Tq
C1CFG2 = 0x2D2;
C1FCTRL = 0xC01F; // No FIFO, 32 Buffers

//
// set up the CAN DMA0 for the Transmit Buffer
//
DMA0CONbits.SIZE = 0x0;
DMA0CONbits.DIR = 0x1;
DMA0CONbits.AMODE = 0x2;
DMA0CONbits.MODE = 0x0;
DMA0REQ = 70;
DMA0CNT = 7;
DMA0PAD = (volatile unsigned int)&C1TXD;
DMA0STAL = (unsigned int)&ecan1MsgBuf;
DMA0STAH = (unsigned int)&ecan1MsgBuf;

DMA0CONbits.CHEN = 0x1;
IEC0bits.DMA0IE=1;
C1TR01CONbits.TXEN0 = 0x1; // Buffer 0 is the Transmit Buffer
C1TR01CONbits.TX0PRI = 0x3; // transmit buffer priority

// Place the ECAN module in Normal mode.
C1CTRL1bits.REQOP = 0;
while (C1CTRL1bits.OPMODE != 0);


}
int main()
{
System_Colck();
TRISBbits.TRISB11=0;
CAN1_Init();
while(1)
{
CAN_Transmit();
LEDBlink();
}

}
unsigned int i = 0;
void LEDBlink(void)
{
PORTBbits.RB11 = ~PORTBbits.RB11;
Delay_1ms(100);
}
void CAN_Transmit(void)
{
ecan1MsgBuf[0][0] = MSG_SID << 2;

ecan1MsgBuf[0][1] = 0x0000;
/* CiTRBnDLC = 0b0000 0000 xxx0 1111
EID<17:6> = 0b000000
RTR = 0b0
RB1 = 0b0
RB0 = 0b0
DLC = 6 */
ecan1MsgBuf[0][2] = 0x0006;

// Write message 6 data bytes as follows:
//
// POTH POTL TEMPH TEMPL 0000 S3S2S1
//
ecan1MsgBuf[0][3] = 10; // switch data, leading zeros
ecan1MsgBuf[0][4] = 50;
ecan1MsgBuf[0][5] = 50;

Nop();
Nop();
Nop();

/* Request message buffer 0 transmission */
C1TR01CONbits.TXREQ0 = 0x1;
/* The following shows an example of how the TXREQ bit can be polled to check if transmission
is complete. */
Nop();
Nop();
Nop();
while (C1TR01CONbits.TXREQ0 == 1);

// Message was placed successfully on the bus, return
}
void UART_TX_Init(void)//配置发送
{
RPOR5bits.RP48R = 0b000001;//配置RP48为TX引脚 RC0
U1MODEbits.STSEL = 0;//一个停止位
U1MODEbits.PDSEL = 0;//8数据位 は奇偶校验
U1MODEbits.ABAUD = 0;//禁止波特率测量或测量已完成
U1MODEbits.BRGH = 0;//BRG 在每个位周期内产生 16 个时钟信号 ( 16 倍频波特率时钟,标准模式)
U1BRG =BRGVAL;
U1STAbits.UTXISEL0 = 0;
U1STAbits.URXISEL1 = 0;//当接收到一个字符且该字符从 UxRSR 传输给接收缓}区,
//使接收缓}区有一个或多个字符时,中断标志位置 1。
IEC0bits.U1TXIE = 1;//使能发送中断
U1MODEbits.UARTEN = 1;//使能UART
U1STAbits.UTXEN = 1;//使能发送
}
void UART_RX_Init(void)//配置接收
{
TRISCbits.TRISC2 = 1;
RPINR18bits.U1RXR = 50 ;//将接收配置到RPI50 RC2
TRISBbits.TRISB12 = 1;
U1MODEbits.STSEL = 0;//一个停止位
U1MODEbits.PDSEL = 0; // 8数据位 は奇偶校验
U1MODEbits.ABAUD = 0; // 禁止波特率测量或测量已完成
U1MODEbits.UEN = 0b00;//使能并使用UxTX和UxRX引脚; UxCTS和UxRTS/BCLKx引脚由端口锁存器控制
U1MODEbits.LPBACK = 0;//禁止环回模式
U1MODEbits.RTSMD = 1;//UxRTS引脚处于单工模式
U1MODEbits.BRGH = 0; // BRG 在每个位周期内产生 16 个时钟信号 ( 16 倍频波特率时钟,标准模式)
U1BRG =BRGVAL;
U1STAbits.URXISEL = 0b00;//当接收到一个字符且该字符从 UxRSR 传输给接收缓}区,
//使接收缓}区有一个或多个字符时,中断标志位置 1。
U1STAbits.ADDEN = 1;
IEC0bits.U1RXIE = 1;//使能接收中断
U1MODEbits.UARTEN = 1;//使能UART
}
void __attribute__((__interrupt__, auto_psv)) _U1TXInterrupt(void)//发送中断
{
IFS0bits.U1TXIF = 0;
}
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)//发送中断
{
IFS0bits.U1RXIF = 0;
}
void __attribute__((interrupt, no_auto_psv)) _DMA0Interrupt(void)
{
IFS0bits.DMA0IF = 0; // Clear the DMA0 Interrupt Flag;
}
void __attribute__((interrupt, no_auto_psv))_C1Interrupt(void)
{
IFS2bits.C1IF = 0; // clear interrupt flag
if (C1INTFbits.TBIF)
{
C1INTFbits.TBIF = 0;
}
}

2016/11/04 17:45
轉換PDF檔 列印


Re: P33EV256GM104 ECAN 發送問題
資深會員
註冊日期:
2010/07/12 16:45
來自 台灣的某一個角落
所屬群組:
註冊會員
文章: 250
等級: 14; EXP: 78
HP : 0 / 344
MP : 83 / 6841
離線
話說我先按造註解下去找,
那你貼的程式碼void CAN1_Init(void)裡面

/*RPINR26 = 0x34; // connect CAN RX to RPI52
RPOR5 = 0x000E; // connect CAN TX to RP97*/

又被註解掉,那請問你的PPS設定在哪?
你電路的CAN TX 、CAN RX 又分別接在哪?

請先double check一下是否有漏掉沒定義的暫存器,所以才造成不運作。

2016/11/09 14:30
_________________
除役的胖子FAE
轉換PDF檔 列印


Re: P33EV256GM104 ECAN 發送問題
新會員
註冊日期:
2016/11/04 17:38
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 3
離線
引用:

linwangco 寫道:
話說我先按造註解下去找,
那你貼的程式碼void CAN1_Init(void)裡面

/*RPINR26 = 0x34; // connect CAN RX to RPI52
RPOR5 = 0x000E; // connect CAN TX to RP97*/

又被註解掉,那請問你的PPS設定在哪?
你電路的CAN TX 、CAN RX 又分別接在哪?

請先double check一下是否有漏掉沒定義的暫存器,所以才造成不運作。

您好:
註解掉的地方可以忽略掉 我是以沒有註解的地方 去執行程式
這那段下面有
P33EV256GM104 這就是我腳位設定的地方
_TRISC1 = 0; //CANTX
_TRISC4 = 1; //CANRX
RPOR5bits.RP49R = 0x0E;//RP49为TX引脚 RC1
RPINR18bits.U1RXR = 0x34;;//将接收配置到RPI52 RC4

我確認過 沒有沒定義的暫存器
我的CANTX CANRX 是透過NXP CAN Transceiver IC送出來
這部分我確定我IC沒問題 有試過別的MCU 可以打出CAN

所以我就很納悶 我這CODE 到底哪裡 沒有設定好 我的CAN TX一直送不出來

2016/11/09 20:43
轉換PDF檔 列印


Re: P33EV256GM104 ECAN 發送問題
資深會員
註冊日期:
2010/07/12 16:45
來自 台灣的某一個角落
所屬群組:
註冊會員
文章: 250
等級: 14; EXP: 78
HP : 0 / 344
MP : 83 / 6841
離線
UART1 Receive -> U1RX -> RPINR18
你不是要用CAN嗎? 怎麼會設定UART ?
應該用這個
CAN1 Receive -> C1RX -> RPINR26

另外,MCU的CANTX 我印象中是接到Transceiver IC的CAN TX,
MCU的CAN RX 我印象中是接到Transceiver IC的CAN RX,

其他你再實驗看看吧。
我之前是用dsPIC33FJ64GS606跑過CAN,
是有正常運作過的,這顆我倒是沒用過
微薄經驗僅供參考。

2016/11/15 16:18
_________________
除役的胖子FAE
轉換PDF檔 列印


Re: P33EV256GM104 ECAN 發送問題
新會員
註冊日期:
2016/11/04 17:38
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 3
離線
引用:

linwangco 寫道:
UART1 Receive -> U1RX -> RPINR18
你不是要用CAN嗎? 怎麼會設定UART ?
應該用這個
CAN1 Receive -> C1RX -> RPINR26

另外,MCU的CANTX 我印象中是接到Transceiver IC的CAN TX,
MCU的CAN RX 我印象中是接到Transceiver IC的CAN RX,

其他你再實驗看看吧。
我之前是用dsPIC33FJ64GS606跑過CAN,
是有正常運作過的,這顆我倒是沒用過
微薄經驗僅供參考。


我目前只先測試CAN的TX 先不管RX部分

目前測試 發現是卡在 while (C1TR01CONbits.TXREQ0 == 1);
這段 請求CAN發送後,照理說會自動清除為0
但不知道為什麼都不會。

2016/11/15 17:50
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088221 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project