IMAX6Q+DM9000+DP83640設計原理分享

概況:採用飛思卡爾IMAX6Q作爲主芯片,主芯片總線外接MAC芯片和PHY芯片實現網絡功能以及通過專用的物理層芯片實現1588時鐘同步功能。本節只介紹幾本原理,具體的驅動開發流程及1588時鐘同步協議開發移植流程暫不分享。

參考資料:DM9000中文手冊、IMAX6Q datasheet

分三部分講解:一、arm總線簡單講解 二、DM9000接口設計 三、DM9000和DP83640的控制流程


一、arm總線

cpu框架如下:


arm常規的總線結構如下:


二、DM9000接口設計

常見的arm外設接口設計:



本例子採用方案三,具體接口設計如下圖:


三、DM9000和DP83640的控制流程

DM9000控制DP83640寄存器讀寫原理(讀寫的實現可發到流驅動去做,應用程序只發送DP83640寄存器的索引和要寫的數據給驅動)

DP83640通過DM9000去控制,DP83640作爲DM9000的外部物理層。對DM9000的讀寫可通過一個流驅動來實現。DM9000中只有INDEX端口與DATA端口2個寄存器可以直接被CPU訪問,其它的內部控制和狀態寄存器都是通過這2個端口寄存器間接訪問;對這2個寄存器的訪問是通過控制網絡控制器DM9000的CMD引腳來實現的:當CMD=0時,主機訪問的是INDEX端口寄存器;當CMD=1時,訪問的是DATA端口寄存器。本設計將CMD引腳與處理器的地址線A2相連,則DM9000的2個端口地址分別爲:INDEX端口地址=IOaddress+0x00;DATA端口地址=IOaddress+0x04。由於INDEX端口寄存器保存的是處理器要訪問的DATA端口寄存器的內部寄存器的地址,因而對DM9000的控制或狀態寄存器的訪問順序是:首先寫要訪問寄存器的地址到INDEX端口,然後通過DATA端口來讀/寫數據。

 

DM9000訪問PHY寄存器的方法是:

(1)寄存器地址寫到EPAR/PHY_AR(0CH)寄存器中,注意將寄存器地址的第6位置1(地址與0x40或運算即可),以表明寫的是PHY地址,而不是EEPROM地址。

(2)將數據高字節寫到PHY_DRH(0EH)寄存器中。

(3)將數據低字節寫到PHY_DRL(0DH)寄存器中。

(4)發送PHY命令(0x0a)到EPCR/PHY_CR(0BH)寄存器中。

(5)延時5us,發送命令0x08到EPCR/PHY_CR(0BH)寄存器中,清除PHY寫操作。

 

DP83640功能控制說明(具體的寄存器說明見DP83640手冊)

1、  接口通信說明

DM9000與DP83640之間的接口通信主要分兩種,MDIO和MII。

 

任何時候都能通過MDIO接口來配置DP83640的寄存器,即通過DM9000設置物理寄存器的方式。

 

MII接口主要用於網絡字符串的收發,即對應應用層的socket編程,但是配置了DP83640PHY Control Frames Configuration Register(PCFCR),使能PCF後,MII接口也可以用來配置DP83640的寄存器,方式是運用socket發送PCF格式的網絡串。

 

PCF網絡串格式如下:


 


時間設置:

通過PTP Time Data Regiser設置或讀取時間,流程如下:

to set the time:

Write Clock_time_ns[15:0] to PTP_TDR

Write Clock_time_ns[31:16] to PTP_TDR

Write Clock_time_sec[15:0] to PTP_TDR

Write Clock_time_sec[31:16] to PTP_TDR

Write to PTP_CTL with the PTP_Load_Clk bit set

To read the time:

Write to PTP_CTL with the PTP_Rd_Clk bit set

Read Clock_time_ns[15:0] from PTP_TDR

Read Clock_time_ns[31:16] from PTP_TDR

Read Clock_time_sec[15:0] from PTP_TDR

Read Clock_time_sec[31:16] from PTP_TDR

 

 

步進調整,步驟如下:

Write Clock_time_ns[15:0] to PTP_TDR

Write Clock_time_ns[31:16] to PTP_TDR

Write Clock_time_sec[15:0] to PTP_TDR

Write Clock_time_sec[31:16] to PTP_TDR

Write to PTP_CTL with the PTP_Step_Clk bit set

 

速率調整,步驟如下:

Write Temp_Rate[25:16] to PTP Rate High Register(PTP_RATEH) with PTP_TMP_RATE bit set to 0.

Write Temp_Rate[15:0] to PTP Rate Low Register (PTP_RATEL)

 

臨時速率調整,步驟如下:(12爲持續時間設置,34爲臨時速率設置,標誌位不設置時則不是臨時速率)

1. Write Temp_Rate_duration[25:16] to PTP Temporary RateDuration High Register (PTP_TRDH)

2. Write Temp_Rate_duration[15:0] to PTP Temporary RateDuration Low Register (PTP_TRDL)

3. Write Temp_Rate[25:16] to PTP Rate High Register(PTP_RATEH) with PTP_TMP_RATE bit set to 1.

4. Write Temp_Rate[15:0] to PTP Rate Low Register(PTP_RATEL)

 

3、  時間戳

傳輸時間戳參數配置

通過PTP_TXCFG0和PTP_TXCFG1兩個寄存器來配置。

接收時間戳參數配置

通過PTP_RXCFG0, PTP_RXCFG1, PTP_RXCFG2, 和PTP_RXCFG3寄存器來配置。

 

獲取傳輸時間戳

連續讀四次PHY_PG4_PTP_TXTS寄存器,具體流程見PTPGetTransmitTimestamp函數

獲取接收時間戳

連續讀六次PHY_PG4_PTP_RXTS寄存器,具體流程見PTPGetReceiveTimestamp函數。

Hash Value

配置PTP_RXHASH寄存器,用於消息的過濾3002

4、  觸發

通過配置相關寄存器,可實現從GPIO輸出一個觸發信號。通過一個秒脈衝觸發信號可實現FPGA時鐘的調整。

 

初始化觸發,使能觸發設置時間等:

1. Set the Trig_Load bit in the PTP Control Register(PTP_CTL) along with the Trig_Sel setting for

the trigger. This will disable the trigger if it waspreviously enabled.

2. Write to PTP_TDR: Start_time_ns[15:0]

3. Write to PTP_TDR: Initial state, Wait for Rollover,Start_time_ns[29:16]

4. Write to PTP_TDR: Start_time_sec[15:0]

5. Write to PTP_TDR: Start_time_sec[31:16]

6. Write to PTP_TDR: Pulsewidth[15:0]

7. Write to PTP_TDR: Pulsewidth[31:16]

8. Write to PTP_TDR: Pulsewidth2[15:0] (for Triggers 0 and1 only)

9. Write to PTP_TDR: Pulsewidth2[31:16] (for Triggers 0 and1 only)

10. Set the Trig_En bit in the PTP_CTL register along withthe Trig_Sel setting for the trigger

 

讀觸發控制信息:

1. Set the Trig_Read bit in the PTP Control Register(PTP_CTL) along with the Trig_Sel setting for the trigger.

2. Read fields from PTP_TDR in same order as written above.

 

設置觸發:

設置PHY_PG5_PTP_TRIG寄存器。

 

取消觸發:

設置PHY_PG4_PTP_CTL寄存器。

5、  事件設置

設置事件,當事件到來時,可存儲一個事件時間戳,最多可存儲8個事件時間戳。

 

使能事件:

設置PHY_PG5_PTP_EVNT寄存器。

 

查詢事件:

讀取PHY_PG4_PTP_STS寄存器可以查詢是否有事件產生,也可以檢測接收發送或觸發。

 

獲取事件時間戳:

1. Read PTP_ESTS to determine if an event timestamp is available.

2. Read from PTP_EDATA: Extended Event Status[15:0] (available only ifPTP_ESTS:MULT_EVNT

is set to 1)

3. Read from PTP_EDATA: Timestamp_ns[15:0]

4. Read from PTP_EDATA: Timestamp_ns[29:16] (upper 2 bits are always 0)

5. Read from PTP_EDATA: Timestamp_sec[15:0]

6. Read from PTP_EDATA: Timestamp_sec[31:16]

7. Repeat Steps 1-6 until PTP_ESTS = 0

 

 

6、  中斷

觸發、事件、時間戳都可以產生中斷,可通過PTP Status Register使能相關的中斷。中斷的輸出有兩種方式,一是共享中斷通過PWRDN_INTN引腳輸出中斷信號,二是GPIO引腳輸出中斷信號。

 

共享中斷:

配置MII Interrupt Control Register (MICR)寄存器可設置PWRDN_INTN中斷。

中斷處理流程,

1. Read MISR to determine if PTP interrupt has occurred

2. Read PTP_STS to determine which PTP function hasgenerated an interrupt

3. Process Trigger, Event, or Timestamp as indicated byPTP_STS

4. Repeat steps 2 and 3 until PTP_STS[11:8] = 0

 

GPIO中斷:

配置PTP_INTCTL寄存器可配置相關的GPIO中斷。

 

中斷處理流程,

1. Read PTP_STS to determine which PTP function hasgenerated an interrupt

2. Process trigger, event, or timestamp as indicated by PTP_STS

3. Repeat steps 1 and 2 until PTP_STS[11:8] = 0



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章