|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# U5 A! @4 t- Y) a! v- Q+ q4 S7 T; Tinput mcasp_ahclkx,0 \- e( a( y) {, w( k
input mcasp_aclkx,
, S, U. J8 X; C, @input axr0,+ a1 Z9 Z% W) m, \9 h1 E" x8 x+ T( k
( E" M' n% ^ W$ d h6 M1 Y' ?: ?+ O
output mcasp_afsr,
9 G% w4 T u- Y2 Koutput mcasp_ahclkr,4 T6 @4 x- B; r1 W( Q1 m. j# X
output mcasp_aclkr,
' o# T8 w+ H4 J ^6 Joutput axr1,
0 q& i1 B% N3 K6 W# X assign mcasp_afsr = mcasp_afsx;; [. x- q: B+ a/ x' F) s
assign mcasp_aclkr = mcasp_aclkx;
4 ?& o m6 h. T6 i% x# @6 cassign mcasp_ahclkr = mcasp_ahclkx;0 S$ i/ @/ q7 p
assign axr1 = axr0;
- K) n# a' o8 x2 Y0 |+ O
; D+ {/ |* ~3 M: M2 N/ B) n在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 z5 e% C8 n0 r: W; r3 \ z3 \static void McASPI2SConfigure(void) [/ B) ^& p- L
{
" W& F i7 J7 ~4 i" nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);8 ?, a: h+ d, F1 k: ]
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. ~7 v' P+ u. z0 W! a
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" g. t0 p$ Q5 v1 B; c/ a2 o
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */* R7 a) g+ H3 j/ G/ V3 W
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' J" B* h- j8 \, n* A9 k6 J
MCASP_RX_MODE_DMA);. b5 ~7 v Y$ C3 n" G4 p
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( J. o" {2 I& u- G9 O8 |% q9 i6 ]
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' @; c, K8 d6 h/ Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 b' t+ a$ b* X; ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; s0 Q! t7 V2 h5 O! X, r6 MMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 k& O; y: }# j1 \) F0 ^
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# _# q# |7 f V# v0 f) fMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# O6 [- r! }$ i2 V6 oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# J' O# ^/ R. @* S- o) S( MMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# ~! ]0 t2 |& Z9 Y5 E
0x00, 0xFF); /* configure the clock for transmitter */* h k' v2 ^. q0 M8 p. T8 b& C
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. D, C) l) c; DMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 v( \4 V; l# _9 b9 y; N. z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! t) |5 A; b! I/ w! i6 ~4 |0x00, 0xFF);, k& x8 L* G1 q3 X: c
' Y0 I( v, u5 l& _3 C- n- [/* Enable synchronization of RX and TX sections */
3 t q% c6 M: m' n& O4 k* f1 aMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 F" y; O) [5 x) ?) `$ c) w2 M: Q
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, L4 @( a+ ]' H/ d( N: X+ YMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( H5 P; Y8 m& ^8 l9 ?; {, @ F" u** Set the serializers, Currently only one serializer is set as. `- h2 N* k. z& i8 y6 t/ b O7 o% f
** transmitter and one serializer as receiver.
$ _4 ^) ^8 G; z$ y*/
: I" \0 k* S4 FMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ G3 m! k6 t, [0 x2 { l# [6 |. A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# r8 F# Q9 U$ c5 p ~** Configure the McASP pins n9 v5 B/ X$ r3 c9 }4 i
** Input - Frame Sync, Clock and Serializer Rx9 M9 g; n5 S0 U
** Output - Serializer Tx is connected to the input of the codec % F- q8 z8 G8 B7 g
*/7 A9 f8 V. K9 g2 o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! V% e3 l& a2 n& w; L: pMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% C+ V4 z5 r; g$ b/ v" l6 b
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 o+ Q! q9 O+ u& t| MCASP_PIN_ACLKX
) E D/ K" Y' p% Z; I O4 }| MCASP_PIN_AHCLKX) q3 W- _+ v, k% G. O5 e5 `! x* ]
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 D" }2 P& `8 qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# o* @8 r% _' c5 q| MCASP_TX_CLKFAIL N8 ~$ J3 t6 x
| MCASP_TX_SYNCERROR
2 k& v5 ~" [9 V2 }. `| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 N, @/ s3 \/ p; U
| MCASP_RX_CLKFAIL6 Q) s. R3 u) l" q- y" j* L
| MCASP_RX_SYNCERROR A, N5 `# B; u) o. {( T+ m
| MCASP_RX_OVERRUN);
) A5 f* L) p! I8 d' k5 `2 [8 D: M} static void I2SDataTxRxActivate(void)
: `; [0 m2 X, v- \! w{
! s* ]( W- S4 v1 J, e; l/* Start the clocks */
2 O( j! i6 j8 c$ B6 mMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% @) e+ [: e; G. U fMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 T2 {7 R4 p" \ C* z0 }8 S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 I3 X K w' a% ?& \' G4 g
EDMA3_TRIG_MODE_EVENT);
. o5 a8 y. G0 Z+ S/ E F9 B) wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 F& n* F' u) @( {% XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
5 h6 J h( v* S5 m6 C8 L7 vMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 u7 ^4 V5 L. V
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 Q% G: F6 I% F3 g2 G
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 B5 Z1 ~5 E3 r0 n: I# I
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# K2 ^! Q- ~: _8 g6 MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 @( N0 j+ [/ n6 i% w
}
& P6 U& d2 ~: \请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : B) `+ U: G0 f
|