會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





dsPIC33FJ CRC module使用問題請教
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 263
等級: 15; EXP: 17
HP : 0 / 354
MP : 87 / 14934
離線
使用CE151-CRC Generation範例程式

unsigned int Message_16bit[10]={0x3132,0x3334,0x3536,0x3738,0x3930,0x3132,0x3334,0x3536,0x3738,0x3930};
unsinged int crcResult, crcResult1, crcResult2;
...
int main()
{

...
CRC_Init();

crcResult = CRC_ChecksumWord(Message_16bit, 10, 0x0000);

crcResult1 = CRC_ChecksumWord(Message_16bit, 5, 0x0000);
crcResult2 = CRC_ChecksumWord(&Message_16bit[5], 5, crcResult1);
...
}

void CRC_Init()
{
CRCXOR = 0x1021; // Generator Polynomial
CRCCON = 15; // Length of polynomial-1"
}

UINT16 CRC_ChecksumWord(UINT16* data, UINT16 Number_of_words, UINT16 prev_CRC)
{

CRCWDAT =prev_CRC;

CRCCONbits.CRCGO = 1 ;
do
{
while(1 != CRCCONbits.CRCMPT);

while((0 == CRCCONbits.CRCFUL) && (0 < Number_of_words))
{

CRCDAT= *data;
data++;
Number_of_words--;
}

}while (0 < Number_of_words);


while(CRCCONbits.CRCFUL==1);
CRCDAT = 0x0000; /* Do this to shift the last word out of the */
/* CRC shift register */

while(1 != CRCCONbits.CRCMPT);
CRCCONbits.CRCGO = 0;

return(CRCWDAT);
}

執行結果
crcResult=0x2C89
crcResult2=0xE43C
將10字元組拆成2次計算,與1次計算結果crcResult與crcResult2不同,是不是我有那個地方沒有考慮到?

7月27日 10:12:18
轉換PDF檔 列印


Re: dsPIC33FJ CRC module使用問題請教
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14564
等級: 73; EXP: 16
HP : 1082 / 1804
MP : 4854 / 77097
離線
抱歉,我只能找久久之前有上過 CRC 的教材及練習出來做參考。

在教育訓練光碟下 ==> 16-Bits MCU 相關課程 ==>
MCU3122 PIC24/dsPIC特殊周邊 的練習四有 CRC 的說明與實作。

7月30日 14:49:28
轉換PDF檔 列印


Re: dsPIC33FJ CRC module使用問題請教
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 263
等級: 15; EXP: 17
HP : 0 / 354
MP : 87 / 14934
離線
MCU3122的範例我瞭解,我的主要問題是,1次10個int(整數)的CRC checksum,如何拆成2次5個int運算,因為我的數值由RS232傳入,每次只傳5個整數值.

7月30日 16:47:07
轉換PDF檔 列印


Re: dsPIC33FJ CRC module使用問題請教
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1014
等級: 28; EXP: 16
HP : 0 / 679
MP : 338 / 22871
離線
基本上,RS232一次就是一個byte

你要傳10個跟傳5個沒什麼差異

7月30日 20:24:46
轉換PDF檔 列印


Re: dsPIC33FJ CRC module使用問題請教
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 263
等級: 15; EXP: 17
HP : 0 / 354
MP : 87 / 14934
離線
抱歉,寫的太快,實際上每次傳10位元組,組成5個整數值,送入副程式計算
CRC checksum,我上面的程式是有簡化.我的問題主要在於10個整數計算得crcResult=0x2C89,這值是正確的(我由其它的CRC calculator所得),然而因為程式執行過程中,無法一次計算10個整數值,在拆開2次分為5個整數值計算,理論上應該要得到同樣的crcResult,但我不知要如何處理CRC module的程式碼,所以上來請教.

7月30日 20:35:29
轉換PDF檔 列印


Re: dsPIC33FJ CRC module使用問題請教
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1014
等級: 28; EXP: 16
HP : 0 / 679
MP : 338 / 22871
離線
基本上,一次算10個跟5個,它們是不同的!!!

你最後要讀出CRCWDAT之前....
CRCDAT = 0x0000; /* Do this to shift the last word out of the */

簡單的說...
一次算10個,大概是這樣
[0][1][2][3][4][5][6][7][8][9]加0000
分兩次,每次算5個,大概是這樣
[0][1][2][3][4]加0000,[5][6][7][8][9]加0000


所以 除非除非你改寫你的CRC_ChecksumWord
把它拆開來...
或者再加一個參數,讓CRC_ChecksumWord決定要不要加入
最後的0000(提前return CRCWDAT)

試試看,我猜的,不知道對不對...

7月30日 21:37:59
轉換PDF檔 列印


Re: dsPIC33FJ CRC module使用問題請教
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 263
等級: 15; EXP: 17
HP : 0 / 354
MP : 87 / 14934
離線
jason680你是對的,只能改寫CRC_ChecksumWord.

7月31日 14:49:42
轉換PDF檔 列印






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

[進階搜尋]


搜尋
Microchip連結

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