嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,& \# Q" p. W" ~& v1 p* q8 f1 z$ Q
input mcasp_ahclkx,
3 D. I1 ^- u' q: Y& Uinput mcasp_aclkx,
& f/ A: x+ \+ C r' m m, minput axr0,& I" @, }( B- A- n2 B% m, z4 }
6 Z4 }2 Z5 _( V1 `6 o6 \output mcasp_afsr,% f7 E4 Q& O1 W: {/ |
output mcasp_ahclkr,
2 q4 T& r2 Y1 L9 I$ h: Koutput mcasp_aclkr,
/ I& n6 x/ a4 p3 B- a' j- `; ]output axr1,4 T; t3 w- G1 S# W3 u& ]5 B! z
assign mcasp_afsr = mcasp_afsx;2 U+ S! |' [) m' g
assign mcasp_aclkr = mcasp_aclkx;$ f5 ]+ n: @ Z9 X: H
assign mcasp_ahclkr = mcasp_ahclkx;
n6 h# g2 |0 Q& N. b8 V2 }assign axr1 = axr0;
2 g& e8 X: M. z/ y0 ]+ E" n+ o s. F/ r( h& ]$ c+ Q8 Q1 W2 b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: ]% P5 ?) H8 g# I; Y6 @7 y: ~" Sstatic void McASPI2SConfigure(void)5 u; A- v1 W* `4 u
{5 a0 a. N, y1 Y$ F0 {/ y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 G- I% Y; I8 BMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
. }) g- d1 F# ]+ uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% T B; r T* y3 [# EMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 `# N- |. |* `- k2 X- RMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' }' d* e. `% pMCASP_RX_MODE_DMA);
) Z3 c+ H" \% E6 m% j) E9 `( MMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 B5 s! \) d F I! t' C& O
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" {+ y& J' ~5 }8 `- f! o" I4 NMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 ? ^8 [+ @3 t0 |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' o( H$ `: k( w5 q- K( ?7 w( c3 }1 Z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 6 H! b; K, a/ p+ \# Q+ v
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
) `$ O1 X& O0 V) _McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 n8 m& r% V o' h& S2 k6 PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % B- d8 C+ y. c# [- {3 o% M
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' D" v$ q5 X5 s0x00, 0xFF);
/* configure the clock for transmitter */
4 H3 w- h4 u# vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# m3 n5 X, e% b+ j8 F* F6 T5 W, D
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 T! Y; A6 u+ }! p# Q/ Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# {$ d/ z) }; [. I& z
0x00, 0xFF);
' W3 w& v* N+ A: j
* [6 w" ^& M3 H. _/* Enable synchronization of RX and TX sections */
& d4 Z; W, I# T' F; E; X C& FMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* u6 Z) n! z- h* U- J! ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ {& k8 U6 N m) R
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
) E/ `+ ]: m' F3 x) w** Set the serializers, Currently only one serializer is set as
! U6 `# N- M4 _4 l5 @, I** transmitter and one serializer as receiver.
0 C$ s+ X: F' l- ~- L*/) n5 K/ } c0 R/ x0 X- A$ \8 {- c
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) c" Y1 {: M+ e; `# T
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
5 A2 A: R% _6 Y6 s** Configure the McASP pins
* O; x1 g5 |2 k** Input - Frame Sync, Clock and Serializer Rx' ?2 r$ Q; `" n
** Output - Serializer Tx is connected to the input of the codec 1 b; c' O: n, {7 q* D) p" m
*/
7 J) J, q! Z9 E. \0 `McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; C' { b' Y1 V9 T; @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 U; Y; g+ z5 }' r8 X: N
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 Q, S) O' t, S' j" Y
| MCASP_PIN_ACLKX
\ u6 |8 W& Q: ?| MCASP_PIN_AHCLKX$ r: Q# L# {. @( Z( A$ I& g
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
3 I; \0 {. E& B) g2 bMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 y g% j& P6 ~ N| MCASP_TX_CLKFAIL 7 k9 z. W: X" O( v$ |/ A4 _4 l
| MCASP_TX_SYNCERROR+ r4 e; {4 s' Y7 ^
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) m( A- X* t2 ~8 s5 @| MCASP_RX_CLKFAIL
' Z0 B! [0 m" N4 ]) f| MCASP_RX_SYNCERROR
! [( q, [2 B; T# b- F| MCASP_RX_OVERRUN);
m m6 q% \( X9 b}
static void I2SDataTxRxActivate(void)1 d# \6 o, G) S3 h( f7 n
{! Q# U+ t: x; O3 X( ~% p m
/* Start the clocks */
& ^6 B" v2 n/ f" H, Z0 |3 MMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! [ S- w M J D2 l3 xMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; Q7 l d' o- T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 f7 c6 \/ v( Q; L3 OEDMA3_TRIG_MODE_EVENT);5 B- C0 c& r* F* [# o- L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& l1 |. E9 B1 \/ U: IEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */* W3 Y# [. @0 O& b7 T. J- M+ i; r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* _+ W; Q4 C* Q7 k7 w( t( NMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */: d* d$ X4 [6 h s! i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */6 D8 e$ I [' k; m( ?
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. O$ i: V$ P* P" p' I. n/ p
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. l# u p, [3 [
}
# v0 N- @- |4 z6 v) ~9 w! Q! f
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 ^" E* h$ e$ z; q @7 H/ ~1 n/ P
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |