DSP 54x串口FAQ

admin @ 2014-03-25 , reply:0

        串口                

本人正在使用‘542的BUFFER串口,手冊上只有2K BUFFER內的地址設置, 不知道這2K BUFFER是否可以在程序存貯區中任意指定?請賜教。

       

’54X的BPS的ARR和AXR都是11位,其基地址可以查看相應DSP的DATA SHEET。 例如:‘542佔用0800H-0FFFH,C548佔用0800H-0FFFH以及1800H-1FFFH

               

一般DSP串口的工作頻率能不能達到其CPU的工作頻率? 比如,40M的DSP,它的串口能接40M b/s的數據流嗎?

       

我用5402時,用內部的時鐘作為串列時鐘輸出,我測得的頻率達到100MHZ, 但我並沒有這樣用過,我用的是外部的時鐘,接ST-BUS,較慢。

       

不可能。
串口速度由其時鐘決定

公式:

f(pulse mode)=f(timer clock)/period register
f(clock mode)=f/(2*period register)

如果是內部時鐘 f(max timer clock)=f(H1)/2
如果是外部時鐘 f(max timer clock)=f(H1)/2.6


注意:
f(H1)並不是C3x外接的時鐘頻率,而是C3x的內部分頻后的,c3x好象是二分頻

               

mcbsp的個寄存器的sub address是什麼意思?比如RCR10的地址是39H,SUB ADDRESS是02,是說地址是3902H呢?還是說把0002寫到0038H,SPSA0,則0039H的SPSD0對應的就是RCR10的值,還請大蝦指教!

       

應該是先把把0002寫到0038H(SPSA0),則0039H的SPSD0對應的就是RCR10的值,

               

449 5402的mcbsp能否通過232與主機通訊?

       

我的理解(沒試過,不一定對)是不需加什麼板卡,但好像得有電平轉換吧?MCBSP可以模擬非同步232串口,在這份文檔里有:spra661

               

下述寄存器的初值k_spcr1_rs, k_spcr2_rs, K_RCR1, K_RCR2, K_XCR1, K_XCR2, K_PCR, K_SRGRX1, K_SRGRX2具體為何值? 串口初始化完成後,如何發送,接收數據,如何觸發中斷?具體給出一段常式.謝謝!

       

根據具體要求確定串口那些寄存器的值。比如:時鐘和幀信號是進還是出,信號的極性,數據格式是多幀方式還是自動緩衝方式,等等。其中的#K_SPRC_RS是一個值,該值中的某個bit位對應SPRC寄存器的複位位,通常在初始化時要先複位,再修改。對於中斷,可考慮直接觸發中斷,但更常見的是用MCBSP口產生的事件去觸發DMA,再由DMA去觸發中斷。

               

用mcbsp作數據發送,給dxr1賦要傳送的數據之前,我想檢驗xrdy是否為1,也就是是否可以給dxr1賦值了,由於xrdy是spcr2寄存器的第1位,因此我需要先讀取spcr2的值,請問該用何種指令?
stm #spcr2,spsa0
這裡該如何讀取spsd0的值?

       

不能直接使用SPCR2,得先將#1寫入SPSA0,選擇SPCR2,然後就可以使用LDM 39H,A或將DP=0,使用ORM,BITF,CMPM,等判斷。

               

pc和F240串口通訊,時通時不通?作何解釋?

       

看看波特率設置對不對,我自己板子上的UART工作得很好。

               

McBSP當作普通同步串口用是否要注意什麼問題?

       

設置與原來的串口基本一致,主要注意:
1)幀同步信號,時針信號是輸入還是輸出?
2)一個幀(FRAME)中是雙相(DUAL PHASE) 還是單相(SINGLE PHASE)?
3)一個幀中的字長和每個字的比特數
4)中斷產生的方式?
其它設置使用預設設置就可以了.給你一個參考: 發送設置
SPCR1 = 0x0001
SPCR2 = 0x0030 Transmitter reset, transmit interrupt (XINT to CPU) generated by XSYNCERR;
receiver is running with RINT driven by RRDY. FRST & GRST =0
PCR = 0x0A00 FSX determined by FSGM in SRGR, transmit clock driven by external source,
receive clock continues to be driven by external source !!
SRGR1 = 0x0001
SRGR2 = 0x2000 CPU clock drives the sample rate generator clock (CLKG) after a divide-by-2.
A DXR[1,2]-to-XSR[1,2] copy generates the transmit frame-sync signal.
XCR1 = 0x0840
XCR2= 0x8421 Dual-phase frame; phase 1 has eight 16-bit words; phase 2 has four 12-bit words,
and 1-bit data delay
SPCR2 = 0x0031 Transmitter taken out of reset

               

c5402McBSP寄存器子地址是怎麼回事?如何映射和操作?寫一段代碼,可否?

       

1.參看下面代碼:
;------------------------------------------------
; McBSP reg addr
;------------------------------------------------
MSP_DRR02 .set 020h ;McBSP 0 receive reg2
MSP_DRR01 .set 021h ;McBSP 0 receive reg1
MSP_DXR02 .set 022h ;McBSP 0 transmit reg2
MSP_DXR01 .set 023h ;McBSP 0 transmit reg1

MSP_DRR12 .set 040h ;McBSP 1 receive reg2
MSP_DRR11 .set 041h ;McBSP 1 receive reg1
MSP_DXR12 .set 042h ;McBSP 1 transmit reg2
MSP_DXR11 .set 043h ;McBSP 1 transmit reg1

MSP_SPSA0 .set 038h ;McBSP 0 sub-address register
MSP_REG0 .set 039h ;McBSP 0 write reg
MSP_SPSA1 .set 048h ;McBSP 1 sub-address register
MSP_REG1 .set 049h ;McBSP 1 write reg

;sub addr
MSP_SPCRX1 .set 00h ;Serial Port Control Register
MSP_SPCRX2 .set 01h
MSP_RCRX1 .set 02h ;Receive Control Register
MSP_RCRX2 .set 03h
MSP_XCRX1 .set 04h ;Transmit Control Register
MSP_XCRX2 .set 05h

MSP_SRGRX1 .set 06h
MSP_SRGRX2 .set 07h
MSP_MCRX1 .set 08h
MSP_MCRX2 .set 09h
MSP_RCERAX .set 0Ah
MSP_RCERBX .set 0Bh
MSP_XCERAX .set 0Ch
MSP_XCERBX .set 0Dh

;------------------------------------------------
; initialization serial port (McBSP)
;------------------------------------------------
;McBSP0
STM #MSP_SPCRX1,MSP_SPSA0 ;reset all !!!
STM #K_SPCR1_RS,MSP_REG0
STM #MSP_SPCRX2,MSP_SPSA0
STM #K_SPCR2_RS,MSP_REG0

STM #MSP_RCRX1,MSP_SPSA0
STM #K_RCR1,MSP_REG0
STM #MSP_RCRX2,MSP_SPSA0
STM #K_RCR2,MSP_REG0
STM #MSP_XCRX1,MSP_SPSA0
STM #K_XCR1,MSP_REG0
STM #MSP_XCRX2,MSP_SPSA0
STM #K_XCR2,MSP_REG0
STM #MSP_PCRX,MSP_SPSA0
STM #K_PCR,MSP_REG0
STM #MSP_SRGRX1,MSP_SPSA0
STM #K_SRGRX1,MSP_REG0
STM #MSP_SRGRX2,MSP_SPSA0
STM #K_SRGRX2,MSP_REG0

2.例如:

SPCR1_SUBADDR .set 0h
RCR10_SUBADDR .set 2h
SPSA0 .set 38h ;address is 38h for port 0
SPCR10 .set 39h ;address is 39h for port 0
. . . .
STM #SPCR1_SUBADDR,SPSA0h ;Store SPCR1 sub-address into SPSA0
STM #01h, SPCR10 ;Storing 01h into SPCR10.
STM #RCR10_SUBADDR,38h
STM #4h, 39h ; set RCR1 register !
. . . .

               

我們是用mcbsp與dma方式,但是僅僅發送了當前地址的數據,其餘的均未發送,why?下面是我們的程序,請您幫忙檢查一下,我們不知道mcbsp與dma具體如何配合使用

stm SPCR1_0,SPSA_0
stm #1000000011010010b,SPSD_0
stm SPCR2_0,SPSA_0
stm #0000000001011010b,SPSD_0
stm PCR_0,SPSA_0
stm #0000111100000001b,SPSD_0
rsbx intm
stm #0030h,IMR
stm RCR1_0,SPSA_0
stm #0000011100000000b,SPSD_0 ;8 words of each frame;8 bits of each word
stm RCR2_0,SPSA_0
stm #000001110000110b,SPSD_0
stm XCR1_0,SPSA_0
stm #0000011100000000b,SPSD_0 ;8 words of each frame;8 bits of each word
stm XCR2_0,SPSA_0
stm #0000011100000000b,SPSD_0 ;8 words of each frame;8 bits of each word
stm SRGR1_0,SPSA_0
stm #0000000000000100b,SPSD_0
stm SRGR2_0,SPSA_0
stm #0010000000000110b,SPSD_0
stm MCR1_0,SPSA_0
stm #0000h,SPSD_0
stm MCR2_0,SPSA_0
stm #0000h,SPSD_0
stm RCERA_0,SPSA_0
stm #1111h,SPSD_0
stm RCERB_0,SPSA_0
stm #1111h,SPSD_0
stm XCERA_0,SPSA_0
stm #1111h,SPSD_0
stm XCERB_0,SPSA_0
stm #1111h,SPSD_0
* complete the initialization of McBSP0.
stm SPCR1_0,SPSA_0
stm #1000000011011011b,SPSD_0
stm SPCR2_0,SPSA_0
stm #0000000001011011b,SPSD_0
stm PCR_0,SPSA_0
stm #0A00h,SPSD_0
stm SPCR2_0,SPSA_0
stm #0000000011011011b,SPSD_0
stm DMSRC4,DMSA ; Uses DMA channel #4 as serial port transmit data channel
stm #2100h,DMSDN
stm DMDST4,DMSA
stm DXR1_0,DMSDN
stm DMCTR4,DMSA
stm #010h,DMSDN
stm DMSFC4,DMSA
stm #0010000000000000b,DMSDN
stm DMMCR4,DMSA
stm #1101001101000001b,DMSDN
stm DMIDX0,DMSA
stm #0001h,DMSDN
stm #0001000000010000b,DMPREC
serial_transmit_intr:
rete
.end

       

可能一:是DMA的設置不對,檢查一下DMA的地址增加方式是不是加一。
可能二:DMA只工作了一下,把第一個數據傳過去后就停下來了,串口內部的緩衝區的
數值就一直是第一個數據,所以始終就發這一個數據,這種可能性比較大。檢查一下DMA的觸發設置吧。
另外建議您分開檢查DMA和MCBSP的設置,首先看看DMA能不能在內存中搬移數據塊,其次用指令不斷地向MCBSP的數據口寫數據(寫,延遲,寫,延遲,寫,延遲。。。),看MCBSP能不能發出相應的數據。檢查完后再把兩者合併起來。




[admin via 研發互助社區 ] DSP 54x串口FAQ已經有1352次圍觀

http://cocdig.com/docs/show-post-42937.html