嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
* x7 |; G7 O9 ~1 Winput mcasp_ahclkx,7 M) c" L z- v
input mcasp_aclkx,
# u3 W( y( Y0 u1 v; finput axr0,
# ]3 p1 I8 A4 @2 B- q
4 a, |$ q5 w9 @$ q) h# T* w$ Zoutput mcasp_afsr,' R K& Y( l0 k
output mcasp_ahclkr,
! ? t! [( V- v1 {output mcasp_aclkr,
' i/ P% u3 u( X# ioutput axr1," G$ a& q/ y2 F9 a t' w4 ]
assign mcasp_afsr = mcasp_afsx;
- v+ i9 B# ~' z8 Z4 S9 g* {assign mcasp_aclkr = mcasp_aclkx; M* _9 Y3 `: c$ F
assign mcasp_ahclkr = mcasp_ahclkx;
4 ^4 N# ^8 L Iassign axr1 = axr0;
+ V8 e' X! c* U" N, g" k: x+ }' h! T3 s9 A! y6 b/ O' s7 J
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: M: [. s) l2 I1 L0 B
static void McASPI2SConfigure(void)
8 |8 j5 o- Z" I1 E, W* T8 |) T, k s{
% t. T9 q' C' B kMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
. Z; X) Q9 n9 c; K! L2 F' sMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 @" R0 d& y* H8 {$ NMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" P9 x8 D' Y3 r( n+ _9 h0 s! a, mMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 x; ]6 O) E3 ]/ Y; e
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" n2 ]* g. u, W0 F% PMCASP_RX_MODE_DMA);( x! o1 a! _1 I" `! K, u
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 b5 ^; ^$ K/ g8 H4 N. x/ S
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, I" h* J( \, }1 x7 k5 f# ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " d( ~" P6 A) Q* @
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 o1 m3 X _' y) W. qMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) W- _' t0 x* T, h: ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */2 o$ O) P: |. Z/ c r% C. v7 P& y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 L) Y7 x" {1 x, ?" c3 _
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 q/ M S0 P' x/ XMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 h3 o3 c7 o$ F4 |1 ]0x00, 0xFF);
/* configure the clock for transmitter */. T; x" Y5 F& j8 u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( ^- `( s- e) S) u+ }: U: |McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
; D) B( Y( f( q0 HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 h6 k9 ^4 r. U2 o0x00, 0xFF);1 p3 ~) W, Q* Y0 \
' w! i$ ?$ z/ Q/ y6 f( M/* Enable synchronization of RX and TX sections */ / }; R2 I# }9 w( u. I' ]7 {& a) q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
- v/ r* R8 i4 M! C& j/ pMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ @+ w$ E7 ?9 ? h1 n
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/* k- S! r1 z* ^ X) u6 U, Z4 o
** Set the serializers, Currently only one serializer is set as
- d( z6 ~1 t% O- `/ s3 m* R** transmitter and one serializer as receiver.* \3 L0 a; {4 u! H3 o" P0 S) D O
*/* P. l5 P K- R! ^) a+ |; b) b" d
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ `- l- d* n! B; I/ V: R7 ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*5 l. x: L) S2 l1 f3 o# U
** Configure the McASP pins 3 m- o7 C$ {, P5 i6 i% |5 n9 Y
** Input - Frame Sync, Clock and Serializer Rx1 }. Q$ m% n# W
** Output - Serializer Tx is connected to the input of the codec / f' q! \) f: [, O9 _1 y. \) h
*/
* {! {, d! s1 m. yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! g7 N: T6 O3 m' u6 ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! f. d" @! A' y, y K& S* g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" i2 v9 f4 h! Y X8 l: L: [9 ^
| MCASP_PIN_ACLKX' j B% \/ O$ A/ b
| MCASP_PIN_AHCLKX' t k& T# l' b+ e* V
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */ t3 f- { _, `4 m+ a7 G- d
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % M) c5 q3 n4 K7 q
| MCASP_TX_CLKFAIL
( j* ]6 R) }( O+ J) X7 v9 C( B; a| MCASP_TX_SYNCERROR% \, ^3 c' g# ~& @4 b4 z6 i
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 R; p* j- w1 K3 T& P
| MCASP_RX_CLKFAIL# T. N! B* @7 U
| MCASP_RX_SYNCERROR
( J; f# S; l9 L" y: g| MCASP_RX_OVERRUN);
4 Y6 }2 r* a& X9 T5 u& W% a}
static void I2SDataTxRxActivate(void)- N1 ~; ?3 S& g' s# F
{
$ ?1 Z' V. c1 v& h% q- a% D/* Start the clocks */
* h! P2 y# M/ J- U4 u* KMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ c v% I8 u+ o$ Z9 G5 v
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
% @3 M; o* C. v) f9 Z; TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 t! ~0 ]# T% \7 bEDMA3_TRIG_MODE_EVENT);% R2 K% Q4 g- ?1 w9 u2 C0 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + }; ^# C! |* d4 `
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */' |6 b9 ?$ j; `) A) ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 O3 X) n7 K# k3 o
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */- b: ]* E+ v7 V( _
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. |& B* b) r7 O# r6 ^McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! y# d! k- L0 F. m
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, ~* {" u6 V2 Q3 V( _
}
7 ~ h+ e* p, a9 S3 e; e3 R
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 w1 j4 _8 P/ f5 B% {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |