嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,+ q" h) |7 l& Q* L4 _! d4 J0 f& N' V
input mcasp_ahclkx,3 f0 y; z, ?5 t! u/ X
input mcasp_aclkx,
( p% D: b) I$ \/ }1 @6 Y# }% C$ E' ~input axr0,0 N, F3 r# [! g) }4 S
# ]! c. }* S$ P* N7 b- @* \5 J# eoutput mcasp_afsr,! O+ `6 @) [! A P) @7 f
output mcasp_ahclkr,/ j/ m0 P6 ?! J6 P3 P. S9 m# r
output mcasp_aclkr,
( r) q2 B$ y: `# n8 X/ I2 ] C5 J, ]output axr1,3 b; f& Q0 p5 N% [) Q
assign mcasp_afsr = mcasp_afsx;
% O. Z: Z3 _3 i8 l4 {6 dassign mcasp_aclkr = mcasp_aclkx;2 k: P' C' `% g: L1 G7 o* K
assign mcasp_ahclkr = mcasp_ahclkx;
# f$ C' M* s' c+ C9 Uassign axr1 = axr0;
2 B! D* g/ s' }* y& t6 X' f" I/ @
. l+ {/ A8 i9 C* O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 n' p# M+ f: w4 ~8 `static void McASPI2SConfigure(void)3 h/ c9 v4 w4 L, p4 N
{ [% n$ j. g2 f1 Y9 `
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 c+ \9 |# l' r* W0 O5 C/ o Y' I1 SMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
4 z6 r; R; F# ~) y! b8 z+ ^9 rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 U* o% E& \/ e5 y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
! K% n! o9 ~- L& W+ r YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ \8 F! `' S1 w" a& V5 GMCASP_RX_MODE_DMA);
* L' Y: o$ U; eMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& M) @& {2 N9 e5 U7 K5 dMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 N' K8 A2 H3 k7 l& B$ [McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % p {3 g7 B6 [. a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( I, e8 R$ t+ T( oMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 C' P: M0 _' D4 F w( G
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */1 F4 W6 M( T& c/ r4 A
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& H. ]4 H7 p8 e. T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : }6 D2 [+ g5 |" C0 w9 o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& Y8 W7 o: F$ G0 m, B8 n
0x00, 0xFF);
/* configure the clock for transmitter */
1 Y) c9 _& y9 g' Q2 \3 t$ qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); H+ n. K b/ z. H/ ~/ E
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ R2 z \9 Q2 e& Y, K1 n1 ]McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 \- z {" h: h0x00, 0xFF);
' G/ ^. Z/ p4 h3 E+ B/ M3 o2 h6 D W3 I! _$ C
/* Enable synchronization of RX and TX sections */ 6 r9 U$ M- X) u0 G6 n1 H5 x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 o+ [. O T3 {* t. tMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 d0 S( ]$ ^& y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*9 q7 o$ n6 |! g# `) T6 d
** Set the serializers, Currently only one serializer is set as% d$ X. w$ Y. k1 X
** transmitter and one serializer as receiver.
" k. U5 Q2 \! ~- f7 ?8 ~6 a2 U1 K2 e9 G*// R* ^0 B! S1 f$ u/ }* U' l' g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 Q6 x& c- r3 P8 o( SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*' G9 p$ |4 y3 h" d
** Configure the McASP pins - T- K) d1 ?9 ]$ Y" x8 @
** Input - Frame Sync, Clock and Serializer Rx
5 x2 ^; \) z8 u7 i4 Z** Output - Serializer Tx is connected to the input of the codec 0 T0 D$ R. z- n3 s* H! C0 _
*/$ }0 c M1 v- v, ~) {
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) a: ]1 T- M% y/ W+ g
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 M8 V9 A7 X3 j' K# V8 l: Y& _
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
/ i8 S- a" H# Y) v1 e2 r| MCASP_PIN_ACLKX" ?2 f; f. B( V1 F ~/ B& G) z
| MCASP_PIN_AHCLKX. @: F" o9 E2 l" e
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
% p6 A3 q- ~0 S9 u& ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* M+ R# g5 B! z9 G| MCASP_TX_CLKFAIL
% {1 o3 D# U+ E5 O$ f| MCASP_TX_SYNCERROR7 T ]: j4 P( J4 O! @2 I9 W- m
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' h4 I) H% {2 I; Q6 m| MCASP_RX_CLKFAIL
3 s, M, g8 y# _1 \5 v| MCASP_RX_SYNCERROR
1 g( _5 [" ?" ]| MCASP_RX_OVERRUN);7 m3 a1 b& x+ _; t V
}
static void I2SDataTxRxActivate(void)6 f5 ~8 }; ^$ L
{: H% c: Q7 T; u
/* Start the clocks */, j: U2 n. @) H" ~1 L* m
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, o0 c+ d* C+ Z( C; B5 u) i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */5 T4 }+ _# g. j! I. S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 N! d/ c# i8 ?EDMA3_TRIG_MODE_EVENT);
1 ], f6 u* M5 f L& X. NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % K1 A' `9 B# K% z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
( u! O8 P; i5 Q- X4 }+ wMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 l- g7 r/ c6 j$ }" z, OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! C8 O9 X; {0 F/ p, ?+ I7 Z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 S- t* k) l3 T' r( [6 EMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ W% I, u- w: J2 S% D, U. O5 J3 ^' IMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# |( j3 X& t9 Z2 B: U}
9 n& Z; r, `/ ?) | A- ~: o( c请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 ?8 T9 C. I' M2 f
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |