|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ L# S) d+ H& {) r% E
input mcasp_ahclkx,' L7 O4 ]$ o' @& ] y
input mcasp_aclkx,7 Y+ K2 `* T, I
input axr0,
8 `% _7 W* B. d& f+ S# @" V
}) l5 G- ?+ M2 s' w) Poutput mcasp_afsr,
% O' u6 {% T8 e' zoutput mcasp_ahclkr,/ M( B4 L7 u4 o) Q( r# v9 m( C+ C1 H
output mcasp_aclkr,8 M$ h1 d( |5 [0 @% h6 R
output axr1,
3 n/ K, x: \ Y/ r+ P y- x" T assign mcasp_afsr = mcasp_afsx;& @5 h6 y: E; h& k
assign mcasp_aclkr = mcasp_aclkx;
m& R& V' y% Z! T) sassign mcasp_ahclkr = mcasp_ahclkx;. H, a) b/ O6 j) \
assign axr1 = axr0;
1 T' R$ ?$ v& u" M) @3 C7 k- m- X( K9 v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 f8 |" }* I0 M
static void McASPI2SConfigure(void)
% p: n& O( o9 s+ q4 y! ? j{ M( d; m+ v7 x' n4 R) O8 ]
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 D c; B$ C7 Z' ]McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) J* G6 B* _: X4 H0 o- B) s" OMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' I& W' n$ v, i" j
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
z% D9 d, B! o0 v2 N' bMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: H+ v2 @# f9 `+ f4 l
MCASP_RX_MODE_DMA);" F' W1 z) ^* {" y2 O/ I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# d. W8 V7 B' C5 t) R$ r0 p0 XMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 |2 W6 J; e0 j4 a% B t: }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . Q8 ]( U+ l5 d$ V3 c+ A2 |! y+ `% J
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ J: c) j! [, y1 E6 ]% F1 J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
% p/ O/ C: J. f, l4 c4 yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
4 q8 P% W) ^; w$ h+ yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 t3 i" S9 |7 A+ `! {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . a2 ?3 k- A: H0 J ?7 V. e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: o& V# y: X( B8 f
0x00, 0xFF); /* configure the clock for transmitter */2 M4 p, L% j2 B0 Q3 z( ^* n
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 A5 q3 h! z \' c' H# d* GMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 R$ k+ ^, |% R: ^: h) n5 f7 f, Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, D) K9 L' d# b" C* A9 J
0x00, 0xFF);* s- `- S( D: {7 C! T6 G( a* z
2 i$ P. K# S) M% \ e' s' Z/* Enable synchronization of RX and TX sections */
' `- R, W; M9 m, X3 L+ G6 C8 ` SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) H3 R& E H& b0 p7 P, zMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% N6 u1 g: |. S) U* l1 o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*% V( v6 X2 u' w+ G
** Set the serializers, Currently only one serializer is set as$ y% P ]9 F5 }* `+ K
** transmitter and one serializer as receiver., `) a+ J7 f B* D. e
*/
1 z( L9 Z8 X' t+ S. X- D! c; ]McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% v2 e5 e9 @* J: T( |" _% p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& y# @' o3 e5 L5 [1 F% Z** Configure the McASP pins
7 a4 S! w l; z. l** Input - Frame Sync, Clock and Serializer Rx1 K6 T# v5 _5 y! }6 @2 Z& d
** Output - Serializer Tx is connected to the input of the codec
6 d0 f3 ?' q1 B. e ^, w# Y2 g*/0 y8 l2 T" [, E8 f9 e) b7 l
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 M, k; S" }' @% [' {! n5 I; {
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ D- T* o, h! ]" N v2 s% ?McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- y1 B; Z5 f4 ?9 Z2 w| MCASP_PIN_ACLKX
! a1 z. h+ f( a| MCASP_PIN_AHCLKX9 q1 ]2 t+ l+ }7 t3 X2 |
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
' R) u7 ?/ ~6 r! x7 V3 nMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 O5 _; T0 [# I& Q- V4 {
| MCASP_TX_CLKFAIL
+ s' j9 o) @2 o# v8 }$ @2 U| MCASP_TX_SYNCERROR" Y; \: j& q( t
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . D0 L5 b7 I) v5 \) u) w
| MCASP_RX_CLKFAIL
0 E% l$ O J2 v, e) \| MCASP_RX_SYNCERROR R$ Q( `1 f/ g. w! d
| MCASP_RX_OVERRUN);
8 d- E, e6 V: ?9 x8 s& }} static void I2SDataTxRxActivate(void)) W A3 m' Y6 }; r0 l7 q
{. ^* ?! L$ }, ~3 n+ v2 ^
/* Start the clocks */
6 s; i1 B' k( q5 y# eMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 G" k3 K/ N) x! dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */. w% B- b% q5 C m, S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- U% I" o. O4 R8 u8 L
EDMA3_TRIG_MODE_EVENT);
- p" `+ Z: F7 a, }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* E! K! w; D( j: \. w7 R' KEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ h0 ?! V( S1 C+ a; h) k& f
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ [3 C) e# \. t/ w5 N7 M. ]/ o0 U
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */5 j# y0 \- ]* D F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */% @0 N. v# X5 l$ U4 s
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 q4 X; ~3 H) J5 y/ DMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) y' o4 {& [8 P! t0 R; Q
} * {9 E7 z/ N' q8 x
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 l- H6 Q) o6 k( h" I |