|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。# B/ W6 {- l8 |8 k8 M' U# P
我是在DSP初始化这不太明白。& K) g, r) r6 U @. o: l
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。9 K- Y) p' @3 {5 D
! n# p, g: t& }# V8 U8 t( ?, V
- D( b/ D* o9 _( H首先 PSCInit();//UART0使能
1 H3 I. ]; ^7 A9 W* Y% ^void PSCInit(void)
1 r4 e, D K) Y; C{
8 r `3 t- D a8 ?5 @& V // 对相应外设模块的使能也可以在 BootLoader 中完成
$ [" r" F0 d) \# P, {6 J // 使能 UART0 模块8 i" g0 I' N- [& L9 k7 e2 n5 u; F% @
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( G( _3 F; j" c% w
}
6 D# m' L" k& w# s
+ \) b& }' k! Q; H7 i- l+ c/ t
1 y5 v5 M8 m% Y然后是 双核通信的初始化 AppInit();
/ n2 k8 L( H% n6 i! @1 Xvoid AppInit(void)
) h+ q3 z3 _, n) r{! |& a V* \9 J# l1 D! H5 \
/* Structure to initialize IPC (see Ipc.h for definitions) */
' h: f7 z2 v0 r/ N struct IPC_cfg ipcCfg = {
. ^! f3 m' C# V2 h0 g( |! c IPC_DSP0, /* local processor Id */$ J s2 _( A) D% d; w2 C
IPC_ARM_HOST, /* remote processor Id */& w7 [) L- r& l) H! d6 G$ L( T) ~" h
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
8 q# U/ K( L$ I7 |+ H; @5 S' _ IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
5 c" X/ \$ @, ]7 g3 ^& \ NUM_MAX_EVENT, /* maximum number of events to be created */
" {% J( v" ?+ j) r+ p4 ] &ipcPvMemDsp, /* local side private IPC memory */
6 y3 j. e4 S! a2 _7 k &ipcPvMemArm /* remote side private IPC memory */
/ I* @7 D3 g! ?& K/ s };
9 y& ^; ~; q& y IntDSPINTCInit();" k6 W8 c" U; G$ b( d# b Q
IPC_init(&ipcCfg);
7 D: h6 m, I8 ^) U. j. f' g' f. i1 k IPC_intRegister(C674X_MASK_INT5);
$ k& M8 E+ |! J0 S2 t; J4 q0 N iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
2 j: z2 j* E; F# D9 G2 ?! G5 p8 P$ n
/ k3 K8 A5 C4 o' d& P. ` /* Enabling interrupts for DSP C674x CPU */4 B) ^: U4 d( b( x* H
IntGlobalEnable(); /* Enable C674x global interrupt */
# ^9 E, \- l& n# h! T iAssert (Notify_start()); /* This will enable IPC interrupt */1 m. y7 J3 L' |! [+ \. `& e
}
6 C0 G$ L- k: U
2 V0 G, `8 C! h7 }' M+ v( I& Q9 z然后是 0 y2 z' c* C7 V8 {0 i/ }
// UART 初始化
" |- Q9 ]: I" w4 W. y9 O' { UARTInit();# `: Y" A( G" A) }# A
! q( g7 w1 D9 H* ~2 r3 D/ i3 m // UART 中断初始化
4 M( u) v9 _$ e( E UARTInterruptInit();
4 \7 c4 f& j0 e% i
; {# S( y2 X" `( T
M( O- f5 o- M& ~9 h$ N. a' Dvoid UARTInit(void)' N5 v" ~) s- j
{5 \' }7 p/ N! a4 P# W& C
// 配置 UART0 参数2 g, V3 s; R# v$ |7 C9 N
// 波特率 115200 数据位 8 停止位 1 无校验位8 D# h" ^1 X1 k& L2 s
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
' U' L' z- e7 w; u UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- n: U# |7 ^; V // 使能 UART0
/ J4 [3 H% g5 c, A9 ~2 H/ b; V UARTEnable(SOC_UART_0_REGS);( C/ _7 L4 L9 b9 g' @/ j5 [. ]" _1 A! {
7 S2 B9 H# e, K6 N$ ?# o
// 使能接收 / 发送 FIFO# A9 B a7 P8 C( c: Z# h9 l" _
// UARTFIFOEnable(SOC_UART_0_REGS);. u( s }3 v' q! M a
+ O4 T' }# X' X# t2 i- X2 d$ m$ J
UARTFIFODisable(SOC_UART_0_REGS);
6 h1 H* Z4 z9 w' |- K4 }+ d: }" r& `) _, g4 E* O
// 设置 FIFO 级别 接收FIFO的级别3 \7 P o8 P! [* h& c, T
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);$ I% B }* D+ L& N; D4 `
}
! l3 X* x1 O* g# i4 ]4 O
4 f" b6 l- ]8 t5 ]3 x4 r& M, I a g/ w
void UARTInterruptInit(void), ]& Q8 x/ _: j& {5 [
{
7 a1 z: Q$ ]( M( ^; M9 s IntRegister(C674X_MASK_INT4, UARTIsr);* |' t* N6 t, F0 _2 u& \
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);/ _8 g2 q2 ~- Y: f6 O
IntEnable(C674X_MASK_INT4);
2 j7 p N( ~4 I8 n
) e( Y; B3 N: m- H# Z: {$ } // 使能中断, T2 k+ ?4 J7 I* U2 {+ B0 {
unsigned int intFlags = 0;
, j; B% q7 Y* ^" S+ ` intFlags |= (UART_INT_LINE_STAT | \5 ^: @% h% r; ^0 O9 H
UART_INT_TX_EMPTY | \
8 k$ O7 K# r. \5 [' ]; Y% R% K2 P UART_INT_RXDATA_CTI);
. |6 z, j. d3 Y- L9 Z) f- l UARTIntEnable(SOC_UART_0_REGS, intFlags);
6 M* y9 ^, ]* B5 N* p}' L7 r* D, Q9 ^# u, x0 [2 d( E3 |/ {
* J, a% b9 d: e
1 X; x7 ]7 l0 g$ L" jvoid UARTIsr(): w, q6 X6 S- s. Z
{
! C0 ? J$ E' T5 i6 n9 t2 ^ static unsigned int length = sizeof(txArray);% |2 ^1 F+ e9 F7 w) h5 M
static unsigned int count = 0;7 |5 L8 c# U6 [# l' S* u
unsigned int int_id = 0;: P) Z- S4 w, {# [% w
% J$ i% x3 o. Y. W; s1 s
, Y9 N5 {9 t' F. o; c
9 @# ]: j) ~% i2 n9 o1 l // 确定中断源+ h) ^9 X2 I4 D5 f( z
int_id = UARTIntStatus(SOC_UART_0_REGS);0 ^( N( [, u, Q2 X1 b5 W5 t" H+ k! x
# R8 a; I6 { o, l // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。; B4 J9 @. B# I
7 ?8 g7 {2 ^0 @7 H0 h# T' w; Z' ~% @. {9 p4 l) q' v
// 清除 UART2 系统中断/ ]' F& S1 e8 d6 Z& A# I1 ?
IntEventClear(SYS_INT_UART0_INT);2 R8 E8 @2 R8 ^* z5 U% J0 S
4 w0 O# u, M" [# v
// 发送中断4 o* Q' f) G6 f3 ?7 a
if(UART_INTID_TX_EMPTY == int_id)# B# u. N9 T0 ?( x
{
$ ]5 R1 t" A) z3 Z: Q& U if(0 < length)
8 K7 n6 H7 V7 p* H. x3 s {
" z. I& E* N1 _6 X+ K // 写一个字节到 THR1 m2 D6 [1 k3 e8 P! n6 d8 t
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
! h( G) u& R9 I% h! h length--;
3 C. ], u4 v8 k8 K5 l& Z count++;9 d" P/ j& }5 c% \& k) ?- B# \6 p
}; @& M. |( a" D+ i5 G% `/ d( E
if(0 == length)5 l' T- V/ W/ N" E
{
. N+ s$ y" e* z4 K0 S9 V* ~ // 禁用发送中断
( R; Y$ F% s6 Q" k2 l2 O6 ? UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);: {8 C. @1 O- X. {0 i
}
1 ?0 A1 ?- C5 a' C0 d' R9 N: d, s }
( h( T" i* }7 x9 `! r$ [" p, Z' N) i' |% W7 W& d" o0 W
// 接收中断, X/ k2 z" t) k: q. k$ L0 |
if(UART_INTID_RX_DATA == int_id)
* B- V _$ x0 ?! d1 ] {
- l' i, |* L5 G, f$ q, [ Q if(status_a0==0)4 e# i/ Q6 j& t# Y
{
3 P: }/ u0 c3 j/ L9 b a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& R6 i. J: F; f% I2 Q5 Z& X if(a[0]=='#')
; N* ~0 O$ H$ r6 E( G9 |% q2 M {4 g; G+ Y5 F9 w# m+ g# T
status_a0=0x01;1 M$ U9 }, y; W2 e
status_a1=0x01;
: i7 g% Q. u8 m0 o& u0 p' t$ o/ B }% E ]- C1 F* X6 y% }3 k# y! L5 c
}$ s' d6 o0 k" Y; F: e3 G! T
if(status_a1==0x01)
! }% Z9 d% r6 w0 _9 J/ e+ J {5 Q7 q- N& Q2 d0 b6 N
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 D1 N& J8 F7 b' q9 E1 M! H if(a[1]=='R')4 E) E; ~# t: l
{* `2 S6 `0 G5 i6 o) H
status_a1=0;3 Q# h* a& H* s& J8 p* A4 @
status_a2=0x01;1 D0 ^& _) U* ?+ n2 S+ X
}
+ W. l" |4 }- T% B) T, Y" O# p }
( e" q; E: m" E( {1 i0 ]# j% j, J9 { if(status_a2==0x01)6 v+ l. c. o2 n$ H. y; g
{2 @3 B0 h) \' a. S4 D: x
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ |! |! G$ G9 N) a0 O
if(a[2]=='A')
' L& O9 _& ~0 E7 @ F& P! l {
. v) L. Z$ T1 R8 D0 ~7 w status_a2=0;
$ d: L% ^4 C, N) V5 R status_a3=0x01;5 [; Q# a: ]8 ]% ?' n
}. h$ \8 v# u9 ]! k% Z# R9 H- E7 d6 }0 K
}
2 `6 x: l- U! O/ F* T, M if(status_a3==0x01)( n- E4 G6 G8 v/ o- @ n; G; i2 |
{: r! P$ `9 Q) }( C0 e8 P
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
& O) y7 W) ?# ^0 O if(a[3]=='N')
5 m& B6 n- v" x/ R {
) b% p1 t( _' K" _7 ~; a: P9 W status_a3=0;
% }$ E8 R, ?( p4 D7 x status_a4=0x01;; j8 H; i6 ]0 d# \! X/ |
}
% x' h3 O. j1 k }
. z* u5 l5 m& V$ k if(status_a4==0x01)' f1 ?9 L) |/ i' w
{
, c5 O1 t" G( g7 [! Y a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS); R7 @: z! W6 M* d
if(a[4]=='G'); X2 }4 N6 j# R6 A X; U2 y
{
, o- U6 L0 Z) S1 ^) ~ status_a4=0;
5 ~& v+ q6 k" m3 X; c) m" b status_a5=0x01;
1 o* @1 H: S' Y# X }) t0 c" F( S- o, T' z- @
}+ J0 p3 S- l: A$ A r' t. x
if(status_a5==0x01)( H. w4 d- C% B$ D
{
/ N5 M$ k A# }! P a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
) T; g0 n& |# l" A if(a[5]=='E')" o% a& s+ |5 a7 e# w" Z, f
{
$ h( N; Q. _1 M( b status_a5=0;
' u `0 {0 }8 w0 s- b9 c status_OK=0x01;# C5 a/ ~1 P' C$ J* S
}
4 ?! M! g- \3 x- L8 Q }
/ Q8 G+ W( ]* e, L0 h7 ~ if(status_OK==0x01)
8 p. G q" z* T8 C+ X {
- k' R9 \2 k$ ` rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 M% v- T; v' I8 s( N4 ~ lengthrx++;
1 g+ D: s1 A, c- m if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
4 l; v" a G& f: y' ~1 |4 Q9 b {$ l+ ]4 y, f8 C: ^8 D! x
RecState=0x01;
: O0 _0 w; M1 g }/ H9 K) ^( D1 M8 ~) ^; \
}
: P7 K! i3 p1 x* g/ m. t2 v8 J8 |
/ q+ A# `1 m# k3 c8 O7 E }
* ~- C! c, K% M G4 {% r, R) L6 ^" \. T' j
// 接收错误" X c; {5 @0 D, i0 x ~4 x
if(UART_INTID_RX_LINE_STAT == int_id)
8 w# ~ i- Z7 }5 q' F { T" ?1 l8 o6 X
while(UARTRxErrorGet(SOC_UART_0_REGS))4 ?8 r) `. |# I3 B7 r8 _* K
{7 P7 Z" M% ^+ J0 R! e
// 从 RBR 读一个字节3 [# p9 e& R5 i2 N- b1 a. ^5 [
UARTCharGetNonBlocking(SOC_UART_0_REGS);9 U* p2 \5 T4 J( U( B
}1 \% k4 I; s: ^8 K" T7 ~" h
}* w1 H" T8 {0 ~0 R5 v! s
# ?9 O! {$ [% b
return;3 ]* L: R5 x8 r6 X9 ?2 n9 z( T
}& N+ K9 \4 a$ f. P
. D% y {( |' S6 h- Q" w4 O1 k6 ?& _1 z& Q
u% N' G4 Y2 _* S* H# g |
|