當前位置:編程學習大全網 - 編程語言 - Verilog HDL或者C語言對MCP2510如何初始化?我想知道具體的地址和值

Verilog HDL或者C語言對MCP2510如何初始化?我想知道具體的地址和值

示例程序

void InitMcBSP0(void) //將McBSP0初始化為SPI

{

SPSA0=SPCR10_SUB;

SPSD0=0x00; //接收端復位RRST=0

SPSA0=SPCR20_SUB;

SPSD0=0x00; //發送端復位XRST=0

SPSA0=SPCR10_SUB;

SPSD0=0x1800; //CLKSTP=11

SPSA0=PCR0_SUB;

SPSD0=0x0A08; //CLKXM=1(主設備);CLKXP=0

SPSA0=RCR10_SUB;

SPSD0=0x00; //RWDLEN1=000,接收包長度為8

SPSA0=RCR20_SUB;

SPSD0=0x0001; //在BFSX信號上提供正確的建立時間

SPSA0=XCR10_SUB;

SPSD0=0x00; //XWDLEN1=000,發送包長度為8

SPSA0=XCR20_SUB;

SPSD0=0x0001; //在BFSX信號上提供正確的建立時間

SPSA0=SRGR10_SUB;

SPSD0=0x00FE; //為采樣率時鐘定義分頻因子

SPSA0=SRGR20_SUB;

SPSD0=0x2000; //CLKSM=1,從CPU得到時鐘;每個包傳送時,激活BFSX信號

SPSA0=SPCR20_SUB;

SPSD0=0x0063; //發送端脫離復位XRST=1

SPSA0=SPCR10_SUB;

SPSD0|=0x0001; //接收端脫離復位RRST=1;采樣率產生器脫離復位GRST=1

delay(256); //為使McBSP邏輯穩定,需等待兩個采樣率產生器時鐘周期

}

二.HDn作為片選信號時DSP與MCP2510通信過程

2.1讀程序

2.1.1 MCP2510讀取過程

在讀操作開始時,CS引腳將被置為低電平。隨後讀指令和8 位地址碼(A7 至 A0)將被依次送入MCP2510 。在接收到讀指令和地址碼之後, MCP2510 指定地址寄存器中的數據將被移出通過SO引腳進行發送。每壹數據字節移出後,器件內部的地址指針將自動加壹以指向下壹地址。因此可以對下壹個連續地址寄存器進行讀操作。通過該方法可以順序讀取任意個連續地址寄存器中的數據。通過拉高CS引腳電平可以結束讀操作。

編程時需註意問題:

1. SPI的讀操作是通過寫操作完成的。因此在DSP發送地址字節後,再發送壹任意8位數據以產生接收時鐘。

2. 在發送完任意8位數據後,DSP要有個延時,以等待寫入DXR的數據從發送端移出,從而保證從2510輸出的數據能夠正確地被DSP接收。延時時間應大於采樣率產生器輸出的8個周期,最好長壹些。

3. 由於SPI在發送數據的同時也在接收數據,所以在讀取有效數據前(即在發送地址字節完畢後)要先清空接收緩沖器,否則可能會因為接收緩沖器溢出而無法接收有用的數據。可以通過讀取3次(因為5402的McBSP有3個接收緩沖器)接收緩沖器DRR的值來實現清空緩沖器的操作,讀取之前要註意延時(等待地址字節發送完畢)。

2.1.2 示例程序

Uint16 ReadMCP2510(Uint16 Addr)

{

ChipSlctMCP2510(0); //打開片選

NOP;

NOP;

NOP;

//發送讀指令

DXR10=READ_MCP2510;

SPSA0=SPCR20_SUB;

while(!(SPSD0&0x02)) //等待上壹個數據發送完畢

{;}

//發送地址

DXR10=Addr;

SPSA0=SPCR20_SUB;

while(!(SPSD0&0x02)) //等待上壹個數據發送完畢

{;}

delay(1000); //延時,等待地址字節從DX移出

//讀取數據

Addr=DRR10; //讀3次,清空緩沖器

Addr=DRR10;

Addr=DRR10;

DXR10=0; //發送任意數據,以便產生接收時鐘

SPSA0=SPCR20_SUB;

while(!(SPSD0&0x02)) //等待上壹個數據發送完畢

{;}

delay(1000); //延時,等待數據接收

Addr=DRR10; //第壹次為無效數據

ChipSlctMCP2510(3);

return Addr;

}

2.2寫程序

2.2.1 MCP2510寫操作

置CS引腳為低電平啟動寫操作。 啟動寫指令後,地址碼以及至少壹個字節的數據被依次發送到MCP2510 。只要 CS 保持低電平,就可以對連續地址寄存器進行順序寫操作。在SCK 引線上的上升沿,數據字節將從D0位開始依次被寫入。如果CS 引腳在字節的8 位數據尚未發送完之前跳變到高電平,該字節的寫操作將被中止,而之前發送的字節已經寫入。

編程時需註意問題:

1. 2510如何區分指令、地址和數據?由於讀寫指令、地址字節和數據字節的值可能會壹樣,所以有必要通過壹定的時序來將他們區分開來。經實驗驗證,2510應該是通過片選信號CS來區分這幾個數據的,當CS從高變低後,第壹個字節就是指令,哪怕上次沒有正確的讀寫,只要將CS置1,然後再置0,就會重新開始壹個指令的周期。

2. 發送完數據字節後壹定要有個延時來等待數據字節從DX引腳發送出去,之後才能將片選信號CS置1,否則無法正確寫入數據。

2.2.2 示例程序

void WriteMCP2510(Uint16 Addr,Uint16 wrData)

{

ChipSlctMCP2510(0);

NOP;

NOP;

NOP;

DXR10=WRITE_MCP2510;

SPSA0=SPCR20_SUB;

while(!(SPSD0&0x02)) //等待上壹個數據發送完畢

{;}

DXR10=Addr;

SPSA0=SPCR20_SUB;

while(!(SPSD0&0x02)) //等待上壹個數據發送完畢

{;}

DXR10=wrData;

SPSA0=SPCR20_SUB;

while(!(SPSD0&0x02)) //等待上壹個數據發送完畢

{;}

delay(1000);

ChipSlctMCP2510(3);

}

三.BFSX作為片選信號時DSP與MCP2510通信過程

由於要完成2510的讀寫操作需要3個字節,所以采用BFSX引腳作為MCP2510的片選信號時需要將XCR1和RCR1中的XWDLEN1、RWDLEN1設置為100(24bit)。

由於發送接收字長度設置為24位,因此在發送過程中需要用到DXR2和DRR2寄存器,在此需要註意的壹點就是,DXR2(DRR2)必須要比DXR1(DRR1)先初始化或讀取。其中DXR2(DRR2)中存放的是24bit的高8位,DXR1(DRR1)中存放的是24bit的低16位。發送時DXR2中的數據首先發送,接收時數據首先存放到DRR2中,因此DXR2(DRR2)中存放指令字節,DXR1(DRR1)中由高到低存放地址和數據。

下面為壹個簡單的調試程序。

Uint16 Debug24bit( )

{

int i;

DXR20=0x02; //寫指令

DXR10=0x0F01; //0F為CANCTRL地址,01為待寫入的數據

delay(3000); //延時,等待發送完畢

i=DRR10; //清空接收緩沖器

i=DRR10;

i=DRR10;

DXR20=0x03; //讀指令

DXR10=0x0F00; //0F為CANCTRL地址,00用於讀取數據

delay(3000); //延時,等待接收完畢

i=DRR10&0x00FF; //DRR10低8位為有用數據

return i;

}

四. 通信時MCP2510的初始化

4.1.1 確定時間份額

計算公式:

時間份額TQ定義為:TQ = 2*(BaudRate + 1)*TOSC

其中,BaudRate 是由 CNF1.BRP<5:0> 表征的二進制數。

標稱位時間 = TQ * (Sync_Seg + Prop_Seg +Phase_Seg1 + Phase_Seg2)

- 同步段(Sync_Seg)

- 傳播時間段(Prop_Seg)

- 相位緩沖段1 (Phase_Seg1)

- 相位緩沖段2 (Phase_Seg2)

假設每個標稱位包含N個時間份額TQ,則根據以上公式有:1/100K = N*TQ

現設定分頻值BaudRate為1,根據以上公式計算,得出在4MHz時鐘時,要實現100Kbps的波特率每個標稱位包含個10時間份額TQ,在N滿足要求的情況下BaudRate還可以設置為其他值,由MCP2510的手冊得知的TQ數量N應在6-25之間。然而在滿足這個前提下,應盡量使TQ的時間短壹些,即壹個標稱位的時間份額數量N多壹些,這樣選擇采樣點位置時具有更好的分辨率。

4.1.2 設置時間段和采樣點

在確定了壹個標稱位包含的時間份額數量後,還需要對各個時間段包含的時間份額進行分配,以確定采樣點的位置。位的采樣時刻取決於系統參數,通常應發生在位時間的60-70%處。同時,同步段的時間份額為1 TQ,TDELAY典型值為1-2TQ。因此時間份額分配如下:

(Sync_Seg + Prop_Seg +Phase_Seg1 + Phase_Seg2)=(1+2+3+4)

4.1.3 確定同步跳轉寬度和采樣次數

根據規則,SJW最大值 為4TQ。然而通常情況下,只有當不同節點的時鐘發生不夠精確或不穩定時,例如采用陶瓷諧振器時,才需要較大的SJW。壹般情況下, SJW取1即可滿足要求。

  • 上一篇:金剛結吊墜掛繩編法
  • 下一篇:AE粒子特效怎麽制作煙花效果?AE粒子特效制作煙花效果教程
  • copyright 2024編程學習大全網