|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
$ M0 t# H& ^0 M$ T* B0 N* a+ ^" Vinput mcasp_ahclkx,4 [) |4 Q1 s; L# j7 f2 k0 m
input mcasp_aclkx,6 j( G7 r. b& E
input axr0,
, R$ A! p+ s: }, L3 k& u4 s* t: l9 ^2 K T8 E
output mcasp_afsr,
/ I6 C2 {$ v& L: g% r# ^+ Koutput mcasp_ahclkr,, Z& Q# a& Z6 \" r0 K, M+ c
output mcasp_aclkr,. I2 P" z) F5 q
output axr1,
9 q* x4 l, n0 d7 k assign mcasp_afsr = mcasp_afsx;( y3 |2 |0 T m" p9 G5 B/ \, O- r
assign mcasp_aclkr = mcasp_aclkx;! _6 _) X3 x6 p! s! b$ O# ~
assign mcasp_ahclkr = mcasp_ahclkx;# N% J3 I% }% ~
assign axr1 = axr0; ' G8 k8 r" _+ @4 S% z$ v6 ?, a* W
- }0 \& ^( E+ v0 \
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 / e5 F: A3 k# H. E; _2 ~; s
static void McASPI2SConfigure(void)& b1 n. |/ `# t2 e/ c9 M6 _# @8 t) z
{* }4 J' q- y: ]" [0 _" _+ d
McASPRxReset(SOC_MCASP_0_CTRL_REGS);) D7 e# p/ ? q6 M( i# K6 u. k
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ `* j3 v7 ~2 {: CMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' N6 C& M- D/ K9 W9 \
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */* o f! s9 ?# J
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# k8 ~! i( B: L; ^1 F$ o
MCASP_RX_MODE_DMA);% @- q7 @5 v( e9 L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% x0 K6 s/ T! iMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! o: R9 G1 [) a" \; P: B9 Q8 e% n9 oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - h0 R: V# G, \) `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 A# u! |- V+ d# C% S1 J$ WMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' R8 m: ^" h5 {2 HMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */9 S" h5 j% D! s$ a7 h
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ E9 b# U' I9 R, X7 m, tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 x8 r+ R- a0 V8 N$ O$ f8 R
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: [2 M% R" A5 w' @0x00, 0xFF); /* configure the clock for transmitter */
" ^4 {" H0 e. W" ?7 NMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 ]& O. s: Y8 u9 g9 M# sMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 A1 z, c+ H5 M' |/ q* ?! Z" JMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! N \7 N! K$ N# k1 l$ @( F0x00, 0xFF);
4 @" T) _! Y6 F8 v2 r, A( x a$ E' J s! }; U& E
/* Enable synchronization of RX and TX sections */ 8 k0 i5 P1 l6 x, w
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 ^) A7 @% p0 A) o9 u3 c7 y; q) `; `McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 i* T6 `* j9 H9 N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
6 I* S$ D* L0 o5 S) k2 @6 U** Set the serializers, Currently only one serializer is set as
4 X% F, E0 S, f6 N. z. d** transmitter and one serializer as receiver.) g( _4 W0 L @
*/* b4 a; Q; Y4 x7 d6 B
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ z) T- s! U7 x6 ~+ Y: KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 l) a [& G8 ^' F. K** Configure the McASP pins : O& [6 t V/ |) C+ V$ W
** Input - Frame Sync, Clock and Serializer Rx/ d! F' `$ w+ x$ e9 ]' \
** Output - Serializer Tx is connected to the input of the codec ! d5 t0 y4 Q5 Y
*/
( a" b/ J" h# l) TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 a$ j. ?3 |5 h2 }9 S" @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 M2 k! I* u" _, G- a& D' c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 M: j _# _5 T
| MCASP_PIN_ACLKX
2 {3 P" P' c/ V! }" ?& V+ C| MCASP_PIN_AHCLKX, J2 _% y- ]" o# u$ P2 Z v9 G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# _' d2 ?% A- ^9 R% j! aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ _$ |* r' _" q2 j$ g% g| MCASP_TX_CLKFAIL 8 |' a: C9 K$ i8 S: M4 N. h
| MCASP_TX_SYNCERROR
2 U/ Q3 j; A% w$ c| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # f/ ]# L- N# g1 S. @" A" \
| MCASP_RX_CLKFAIL0 c7 M- ?, I* t7 ?/ w% _& Y7 ]
| MCASP_RX_SYNCERROR
% q d' E9 S5 _| MCASP_RX_OVERRUN);
7 G ], I# ~7 E E} static void I2SDataTxRxActivate(void)
. f# A) }4 c" e2 L, g{
. I. z3 Q1 C6 u( |/* Start the clocks */
6 p n, N0 R! P' u& W7 b& D9 N" PMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 \5 L' s! U+ S( o( ~1 `+ m) wMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
B" W& V0 m3 C6 V! Z& n4 sEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
Y' x T) m+ ]6 V/ h% UEDMA3_TRIG_MODE_EVENT);, ^' [5 C; o# Q0 C$ z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ \* F4 ?( x7 t+ IEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 \5 e# Y q8 QMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: u5 \" y6 k# F! I
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; T; A* M7 e o' n ~2 Dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. j5 R3 E* Q, L# hMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" `6 m4 Y4 ?/ f# {. E9 h# V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, y. z( F! X" A {! p- s
} - E$ O) Z8 v) H0 G, Q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# ]6 D" A" Z% h$ P P |