|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,5 l+ {% c) l3 w8 m0 K% R+ A2 e
input mcasp_ahclkx,$ q+ h+ m( E$ p8 n E/ W/ M
input mcasp_aclkx," s `7 A! H/ T
input axr0,# s8 Y4 J( L5 f+ r, `0 c! f
: i% q6 y. a% i3 j! \2 H ~, N2 p4 coutput mcasp_afsr,
2 h+ p1 |+ }# Eoutput mcasp_ahclkr,
; o) G+ T( R, x/ voutput mcasp_aclkr,9 X, p/ m; i: i! V: t1 i( E C2 z
output axr1,
4 `6 K: o3 f# z/ D+ x assign mcasp_afsr = mcasp_afsx;7 ?8 B9 s6 H4 W* K
assign mcasp_aclkr = mcasp_aclkx;
6 U: d1 J M3 O/ _4 {0 |% Y' H/ E+ Kassign mcasp_ahclkr = mcasp_ahclkx;& l: O& W4 T b
assign axr1 = axr0; ) y" w, {3 e& D! Y/ o& q
. L( W2 a- P" {# ~$ q; ^7 v q' s
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 T3 z' U1 x3 C
static void McASPI2SConfigure(void)
/ r% M$ D5 P1 U9 X! ^{; }; `2 S" ?. }4 @
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, d& U$ K( d# s) TMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */" R5 b9 {5 i; `: d% o2 x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. X: F0 R. c% ^7 X
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ n6 M$ M4 m9 |; e8 B) iMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 w9 R O& a4 c
MCASP_RX_MODE_DMA);. Y7 M* Y" X& b# G, Q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) L+ y, n7 C& i' U9 U" h
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' W$ Q5 X K. W! d
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( D4 v" {5 t) b6 @, K! aMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. v8 {! s1 T' ~, v0 {6 A0 U+ PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: \% X4 f3 G+ ~9 `- e# lMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */( ]* Q8 M {* l! ?" S! G) B
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; ?. z$ L, O }. V9 V. UMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: q. E V& e$ GMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" e) y, j8 F2 ~0x00, 0xFF); /* configure the clock for transmitter */
, C$ D# D4 g& {8 ?# wMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ [$ p! P4 Q1 i3 KMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 s& ~. y0 E9 T+ _% T+ {; }8 `
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" J$ d% ]" R' u8 w5 k/ ~& g! s0x00, 0xFF);
" @0 @) @ A* @( f
2 K+ ]* r6 U: ^/* Enable synchronization of RX and TX sections */
4 U) n) U+ U5 g& v+ j- PMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */, e/ a- j0 w7 \9 t& i' S X7 j
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. g- {. [- ?; `; A1 p) [
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ H; l- J0 s, f7 |& T
** Set the serializers, Currently only one serializer is set as
' I9 x1 W4 q4 O# A, Z** transmitter and one serializer as receiver.5 G. M b! l0 K5 @8 _
*/6 Y: P* e3 q- f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, @4 z% M ?; i5 c' |2 _McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 f" a! d9 ~1 |* Y+ w) U** Configure the McASP pins " o9 o5 x5 H1 S+ W% D' O( b
** Input - Frame Sync, Clock and Serializer Rx
+ P [$ `; x( W3 g* b** Output - Serializer Tx is connected to the input of the codec
: @4 @- W# z. E, a+ F: p( M% h; `4 R*/
5 X. t" c9 A$ r" \0 R5 _- U) {McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 D* n, N& H/ `- Q/ V7 U! aMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" l3 P: M* | K1 Q' d p
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* l$ z; e% n6 D* u& g& c! {; k| MCASP_PIN_ACLKX
) d8 ^0 b/ d; s1 R: Y| MCASP_PIN_AHCLKX5 d- B. y4 Y7 G2 K# M; y6 F
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ Q! k% k C2 o, ZMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + ?, a& @$ B& g" ]) V, K
| MCASP_TX_CLKFAIL 3 m% ]2 N8 a) A% z9 v3 W/ S8 A
| MCASP_TX_SYNCERROR
4 V" e8 o' k8 K8 P8 M. n5 F| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 0 R6 n: Q, @; A4 O, E; s
| MCASP_RX_CLKFAIL
' m. A/ p# T# h! x7 e# n: Y5 a| MCASP_RX_SYNCERROR \2 [/ `1 g; b: Q# v% ^
| MCASP_RX_OVERRUN);6 d v# D& s7 h* x
} static void I2SDataTxRxActivate(void)
2 Z# t+ R; r) q" r{9 z- E0 j& f# @
/* Start the clocks */
0 D' [; s7 V, N# F: r: |$ K8 M3 _0 u: fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# h, b* ~' Y) c% Q% \% iMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */+ J# R% v' w+ x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ F9 |- g2 D6 c7 G
EDMA3_TRIG_MODE_EVENT);
( L2 s ]1 x; K. \7 TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 p) c3 g, J/ b
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */9 ~* S: C* T) O9 _; [, s% L' y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ v3 K: J5 j7 T& G0 o2 Y9 [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! }0 p% q' q2 w/ nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 e2 y" Y0 C- u! H+ }McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 J- C# H$ j, o1 J E
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ |; Y7 v. j! v; f B Q# `+ e: {/ @" N
}
2 E9 L+ `* P' @) K% j: _* A" J请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , g9 N: X5 Z+ Z. t' _0 I& J: q
|