|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
1 b" H/ r% Q1 e8 Y J- q+ Linput mcasp_ahclkx,
$ M0 J( Z3 \& T9 e( N& Ninput mcasp_aclkx,
6 g$ a6 F3 r0 |' j+ A! f+ z/ L; yinput axr0,
4 ~" h- e6 s" g1 q t L4 P0 A
) K) k5 M$ l' c; r' k+ d3 o! |. `output mcasp_afsr,9 b3 }6 J7 S0 u
output mcasp_ahclkr,. k6 }4 a. W0 r. o4 a: n
output mcasp_aclkr,
2 E' a5 w) W9 ], g3 Boutput axr1,7 v( q2 t' E8 B) `: V& B k! N
assign mcasp_afsr = mcasp_afsx;
1 }5 I" s1 R, k0 Hassign mcasp_aclkr = mcasp_aclkx;
+ J$ P" v: n7 t- T: E: E9 Eassign mcasp_ahclkr = mcasp_ahclkx;
5 H9 T7 m* Y6 }: q) C; D6 Iassign axr1 = axr0;
7 ^. j1 @+ Z7 d% s5 ?0 w$ y! H' `7 j) a9 q" @; ? n
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 s L; h( I2 B* p$ Estatic void McASPI2SConfigure(void)/ y4 A9 x2 K9 I* Y3 x0 F# u
{
/ p- d0 D" B. ]/ d/ M: o* h z' wMcASPRxReset(SOC_MCASP_0_CTRL_REGS);9 g& c9 O$ X- }# g0 B0 A5 X' d0 }6 h
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
$ P4 |% W5 a, U. h. q) O) E: gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# R3 L3 S# t9 N) K) Q+ f4 tMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, C% |' x* V# D2 K. B* U6 D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 [, {- ? s5 a) k' b1 G1 Y; j" qMCASP_RX_MODE_DMA);
) D! b0 Q. P" b9 k; V, J- IMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 }0 I2 [/ n& E3 TMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 p! ]8 E# T) P2 u T5 C) J3 s: h+ f; {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( Y3 H) i: P6 J/ e* {: _MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
- V$ H" r/ `4 R; yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & z& I t! l6 ~$ J$ x4 L
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
h( l) M8 Z# u' V# ]& wMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 X6 r+ A# ?1 V( w7 K0 v$ J% bMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 B4 J& I; |1 c6 r) Z; P% s' z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# m* t( z% L+ I0x00, 0xFF); /* configure the clock for transmitter */
D& N( T+ r- n- v' {8 BMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 x* _! s- r# h( fMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 B+ _; x. f+ L& Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" u) h! o5 m+ B% F5 ^ U2 q0x00, 0xFF);5 @" J) @% M* X8 o
* ~- Q4 u1 B7 h
/* Enable synchronization of RX and TX sections */
u$ e; S6 F% @8 f5 E( H @ \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ R/ o0 N9 g! ~/ Q6 I: R( j! ZMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 b3 Q) O' `) d& L( Z9 K- j7 a
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ h" I# F- T: j8 Y- _
** Set the serializers, Currently only one serializer is set as
( e2 X$ _- {. \' R** transmitter and one serializer as receiver.
* e% ~9 M3 [0 X7 u" M' V*/
F8 |; M5 Y w X, MMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 |, W& { e Q$ r, g% ^2 DMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: S |6 P' M+ z% |& y
** Configure the McASP pins
9 Y7 o2 [) [2 h% p5 O* }** Input - Frame Sync, Clock and Serializer Rx3 z1 H1 O# h. E
** Output - Serializer Tx is connected to the input of the codec * c9 B5 k' c) M+ S) s7 j @
*/
- [- M+ A0 K$ W) D; Z2 r, }! |McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 [# e4 N) Y+ F# D0 u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 _) H, Q: G5 n; ~" H" V
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 ?0 j* M$ V' L6 A) O9 P
| MCASP_PIN_ACLKX
% W' Y* Y8 }4 b: j% L| MCASP_PIN_AHCLKX8 _8 @' t: `5 I8 L3 N7 K
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
6 z4 b/ {: e2 b' ^1 f, S5 cMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; ^" e2 E+ C; z' t6 y
| MCASP_TX_CLKFAIL
9 `- H0 n/ W" v3 w/ Z| MCASP_TX_SYNCERROR
9 B! S0 ^5 G$ ?3 w/ R2 r9 x5 e( }| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 E$ W7 G+ K, @4 [' D* K8 n
| MCASP_RX_CLKFAIL
L; t% N7 W6 s1 `5 j) p| MCASP_RX_SYNCERROR
* k& y& C. X" h. s( g' ~| MCASP_RX_OVERRUN);
: [: l4 x Z$ K, P} static void I2SDataTxRxActivate(void)
N, v) b. o3 v/ O{# Q3 y% V4 g# w0 i
/* Start the clocks */- [7 q4 Z# `% E9 q; T# ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, p6 E/ [1 d# r- L) nMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 Y' q4 d( J% |; N" M- bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' G( S( H- I/ l+ T+ ^+ H! |4 f- {4 tEDMA3_TRIG_MODE_EVENT);% k$ C3 _4 D' m4 R8 O
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : O8 r8 s! @! ~0 C+ B2 M7 A) R4 [
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ Y6 ?' |5 L" B. T
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. |; ^3 x/ c. s$ J
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& e1 J2 g8 K+ q" m7 i& f. Q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
* v5 k/ L* k+ u% L$ P9 r: bMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ ~3 C9 a3 {" K9 XMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% F3 U: U0 E1 Q J* l} + [& M9 X h) t* u% D
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 0 d. n2 ]# D& }% G3 V
|