嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,9 r# b7 P$ z& f
input mcasp_ahclkx,
7 B& _* {/ k) ^% J; E, _! c x6 minput mcasp_aclkx,
( N- [+ M- d3 v& q+ G! `7 \3 vinput axr0,
" m# H T; J4 |0 a
' U! Y1 D1 ?, F' ]output mcasp_afsr,# S7 I& d0 P& `
output mcasp_ahclkr,6 q/ ]7 Q4 E: k8 j0 |* q
output mcasp_aclkr,2 w5 C/ c8 [& q
output axr1,
5 ^! C3 Z, Q) L9 r+ L& i0 o" d
assign mcasp_afsr = mcasp_afsx;+ c3 s" o& V1 b( Q/ y- X8 C9 u
assign mcasp_aclkr = mcasp_aclkx;
1 x' T5 t" M6 E! d. g& n& k+ rassign mcasp_ahclkr = mcasp_ahclkx;
0 o: t" ]2 @( d* @/ w+ q- ]$ Vassign axr1 = axr0;
) a, R, r1 ?" N# f0 ]* q) ]
2 ~7 R+ v! R; @. r6 {3 A在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 T" @( T7 o1 R! s# {% Astatic void McASPI2SConfigure(void)# a W* u4 ]4 ^5 X- I8 W
{7 z' @% k0 f- N9 j. T/ r
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) m# }7 Z( \; m+ p; zMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( H' `3 q+ q& {* D# E9 D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' O# \8 l$ Q0 O: M
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
! \6 g: V) q. m" w! v$ v' TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 G7 C7 [# M( y& |MCASP_RX_MODE_DMA);
; q, k8 \1 _0 v) jMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, g" [( `6 {! Y4 `
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& @; \# o- c5 Z; F4 @, hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 U; S: u g$ o% U* }, e4 s, ^MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 c6 P# T# C: ?. e. FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 {3 c- T* h6 c/ n1 s& O
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */6 C* |: S! H. T5 M5 Z& l8 e
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 H/ C6 F7 R& H. }McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 l" E: ~) g r. b' i
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 v4 l. X3 C" S+ ~. O5 I0x00, 0xFF);
/* configure the clock for transmitter */
$ M- r. h9 X$ O; ~McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, V- R8 V0 k$ U
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) s+ p0 x) @+ R L
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ ?1 j/ R. G& E" J/ F8 d0 u0x00, 0xFF);
7 ~, C$ {+ b$ Z& H1 }/ N' b9 H. a+ {" E) g' i
/* Enable synchronization of RX and TX sections */ 9 V. b( f+ |4 x' m; K6 n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 Y) j. L1 O7 v6 b4 }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 M" m' G6 w" U* @- i3 o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/** M8 W: U, H1 N8 R% Q
** Set the serializers, Currently only one serializer is set as' q/ D$ t& ^" }1 c) `: O' l$ q
** transmitter and one serializer as receiver.
/ f$ E; W2 U8 m% Z ^*/
2 v3 L$ d5 Y7 j( a, y% E( ?McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; J& y5 l5 Y. Y: j3 @9 p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*, O6 E& R' g a. A2 P+ G' y
** Configure the McASP pins 1 U7 {: J, F( I m' c
** Input - Frame Sync, Clock and Serializer Rx
" U K i& Y- r3 z** Output - Serializer Tx is connected to the input of the codec 6 V. Z2 j( c, J
*/+ ~! m0 ~9 o( s7 p- [% q+ P
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" u* A+ r. {/ j3 S7 d
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" F& m$ r( h6 S1 |1 G. q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 y6 T9 B1 g6 A9 g* j! T| MCASP_PIN_ACLKX3 Q8 B# D, l- V0 F5 _& C
| MCASP_PIN_AHCLKX
# q/ i: P9 c4 G# C| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
4 D3 e, G: @) KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 J( T* q$ q: G
| MCASP_TX_CLKFAIL
7 j1 c5 y( M4 p/ V3 C! l6 L| MCASP_TX_SYNCERROR# W N3 S5 _$ c4 }7 W# {/ L
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% ]2 x; G* u$ A# | I7 n4 F| MCASP_RX_CLKFAIL
; t' B& Y1 w2 i4 s H| MCASP_RX_SYNCERROR 4 v) E! S+ _* J% f! [: {* J9 B7 Z
| MCASP_RX_OVERRUN);8 D j3 B9 o2 Z
}
static void I2SDataTxRxActivate(void)
$ j9 y2 R. K5 g{ `! a8 b" f2 f5 d( i1 _- n4 l
/* Start the clocks */. K* j' t- }+ R- E$ I: A( k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: h/ g1 a1 \6 k& W; }
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, i" Z, O! Y- I. o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 v6 q% m9 W/ n" ~0 I3 z) ^# |5 r9 ~
EDMA3_TRIG_MODE_EVENT);
0 F! J/ }* s2 H3 c3 NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; f6 d3 @5 U/ v' tEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 x4 b$ R' J1 d; f3 t" I# UMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" q9 u0 y' Y7 F' k3 M( G% T4 D6 VMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */" ~+ B0 d, d% a* Z$ v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */9 t/ h, n: ~ C7 d9 x8 u0 A
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ L% |; K- V9 Z9 k3 U6 J: L9 ?* Z5 iMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: d5 `& [ L% h% w. U}
/ i/ E9 f0 i" I6 ~# \请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& D: l1 {7 p( p! C4 D
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |