|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
4 s1 @: o" {! }我是在DSP初始化这不太明白。
% p8 [7 k K5 d初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
0 V4 n" H4 s9 U. N' d/ m7 ^, b
* E( l+ Y" W& ^! o2 m
( m) P( E$ ]: s* O首先 PSCInit();//UART0使能' f% f$ [6 M+ d9 W% s& T5 a7 |+ m
void PSCInit(void)/ }" q- k4 I/ p9 \! s. F
{ T) `( `! E* \
// 对相应外设模块的使能也可以在 BootLoader 中完成
; f, Z4 v6 x6 `$ }0 n/ t: V4 Q+ v1 a // 使能 UART0 模块& `7 ^5 c6 D; \& o' F6 l" j" ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);, m+ X) U7 d7 I: V. B
}* V, x: s2 e( y2 z8 }- M0 P
# f* j2 `% h/ N6 a' b# Y
6 q( p8 [8 O5 U! |/ O然后是 双核通信的初始化 AppInit();
; Q3 C: S# t, y2 c Tvoid AppInit(void)
6 u! \6 O$ J. Q R( v& J5 ?{
' \% c: ?- O1 r4 R3 C* O /* Structure to initialize IPC (see Ipc.h for definitions) */
% Q3 \+ X6 L& K0 F, q struct IPC_cfg ipcCfg = {9 R5 p! c) S* W( I+ n% c( {
IPC_DSP0, /* local processor Id */! Z5 Y4 V- D. e
IPC_ARM_HOST, /* remote processor Id */: d; s4 ~5 M7 w* g
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
9 U, c; r' ?1 G0 X O IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
/ \& F2 Z4 M5 a( _ NUM_MAX_EVENT, /* maximum number of events to be created */: R8 L6 \( ]1 `% B% W1 H: z! Q
&ipcPvMemDsp, /* local side private IPC memory */# t% N! D7 f% C; }4 l' q ?8 l; h
&ipcPvMemArm /* remote side private IPC memory */9 N% i, ?" N. I/ G2 l; x
};
9 ^. {5 W8 L! ~ IntDSPINTCInit();9 j7 Y" T" [7 M Z& w
IPC_init(&ipcCfg);. l' c8 F' H( e, Q {# y1 M: S. d
IPC_intRegister(C674X_MASK_INT5);) |0 `, j7 b( v" ^' V
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
! l2 s/ P# Q& x9 ?8 p2 v$ k) [. V& M# `. U" V
/* Enabling interrupts for DSP C674x CPU */
. @$ [$ D: U# j* b* L2 z: O IntGlobalEnable(); /* Enable C674x global interrupt */
5 ~3 K3 |$ ?) u. P iAssert (Notify_start()); /* This will enable IPC interrupt */0 ]* p% j0 j5 }
}* g+ N7 K/ k" `0 e, m
y; e! n1 X8 b; s/ L8 X9 i6 q
然后是 5 a5 ?+ }, c4 Q+ C, _
// UART 初始化
3 H) d3 b L/ o2 L, r UARTInit();
& t; @( {9 j/ F4 @% N% C; Q
0 `' U( s! ?4 L$ |* j( k // UART 中断初始化
& c+ q( X' [4 ?, i" |9 l) x UARTInterruptInit();
8 z& C5 Y2 Y- i, X8 t7 {/ ]4 Y5 s& J1 V# v" U8 s# u
) B2 S! q; O0 N5 M
void UARTInit(void)- a1 | y3 }, j. n
{2 ~6 X2 d# B2 O. v/ E1 e z
// 配置 UART0 参数; P7 e V) n. D7 M; A* t
// 波特率 115200 数据位 8 停止位 1 无校验位0 A4 ]7 L, D* X; u
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,6 p ^: t! ]% p
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ G, C2 R. L2 T. Q' M, E6 z- o, ?
// 使能 UART06 T* G# ~) q: S* O
UARTEnable(SOC_UART_0_REGS);
|) h2 B+ I; M8 F. Q) f
" r. p5 o5 U2 B3 L // 使能接收 / 发送 FIFO
B9 @0 S) m" W// UARTFIFOEnable(SOC_UART_0_REGS);
- ^/ m* H3 p7 L& C8 d2 d3 I4 O' j/ ^; _! ~' R0 ]$ p
UARTFIFODisable(SOC_UART_0_REGS);
, B% h8 r6 M8 Z+ N. E
0 L) Q9 A9 w9 K# R' x6 }6 I0 K // 设置 FIFO 级别 接收FIFO的级别& ?2 A5 R, t3 T! |
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
( m4 p9 P) o% q& F: K7 A, ~+ G7 ?}
0 J+ h0 A2 e7 i2 F/ z% R* Q! _8 g( H7 r. |6 Q! j% z, ^
/ Z3 Q( g9 k& A& i# V3 Z* \void UARTInterruptInit(void) t7 h( \: O% u9 P8 E; B
{# n" j' O9 ~( _3 e
IntRegister(C674X_MASK_INT4, UARTIsr);2 ~8 M3 R0 R$ ~4 q0 J' Q
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);9 U; }4 Z# ~7 A! A9 F+ P u3 |
IntEnable(C674X_MASK_INT4);
, `- r, i( i6 \* w; @( }# Q
5 m- i) K% X0 \3 [% n // 使能中断9 F/ J5 D; y4 _0 [4 z( s) l
unsigned int intFlags = 0;
! w2 j( S- B. _3 s5 y6 c intFlags |= (UART_INT_LINE_STAT | \2 p( a: x+ P. Q8 n
UART_INT_TX_EMPTY | \, n$ x" Q6 t# Z8 I2 H" W
UART_INT_RXDATA_CTI);
0 ] }7 \& B+ j7 j( Z3 i UARTIntEnable(SOC_UART_0_REGS, intFlags);
; {' I9 T: ]4 r}( D7 Y, w$ ?' P1 O9 p. j0 g" Q) k
, S+ x0 g- l7 }9 P
7 L1 L$ A3 Q2 U) Svoid UARTIsr()
. M8 F: `/ I$ Y: l. y{
$ f: w' m8 T3 k* Q8 C static unsigned int length = sizeof(txArray);
6 C8 J0 |1 N% { static unsigned int count = 0;1 s7 A9 k. Y6 ]+ N- f; Y4 d8 h9 d
unsigned int int_id = 0;3 w* o. l d/ e) w
! [7 F: \7 b1 ?/ V
& y" n$ ` K9 z) A
, H. a2 C4 s0 w$ b; H* t
// 确定中断源
: K- e1 ^$ `0 q( q0 B6 J: P2 Y int_id = UARTIntStatus(SOC_UART_0_REGS);
0 C3 f0 N7 T [# f3 E* E1 A0 J
4 w+ H; t9 q$ B8 |# x // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。/ W% z* R9 e) F& T' n
+ L+ q! U- V; w/ Z2 D* T
# T9 N7 C' X( O) q& D+ G5 U
// 清除 UART2 系统中断
: e( b& Q( v) l. w IntEventClear(SYS_INT_UART0_INT);0 d, H* s& \/ a7 y- j7 e3 }
# J4 o* \2 q* B6 [( B
// 发送中断
# }4 J5 F; Q: J! }! x5 h8 U0 Q5 ? if(UART_INTID_TX_EMPTY == int_id)
" f: O- \! a) F {- x/ q, i2 B$ B' k% v9 c
if(0 < length)0 G1 ^' ]( f. ^. i( d
{
% E: ?5 i/ S m // 写一个字节到 THR
+ ?0 o' V% M$ Y1 a$ }( l UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
# n( E- O9 ]# ^7 \" w length--;. N, Z' o+ B# e
count++;" a0 _$ k% r7 K7 @6 m5 B( Y& Y. Z0 G
}( c2 f% W! ]: J9 q9 S. j! k: x
if(0 == length)8 R7 N' F2 q+ d0 a5 Z0 x! H
{( z0 h8 R$ ^" k$ r+ y6 p
// 禁用发送中断
9 J2 \; [3 s3 R UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
3 S" r+ T1 g" ~) I }& A1 h) B8 W% M
}6 T' p# G6 M; B. r* |6 c2 C3 y
$ q9 t2 u, V' i+ H; ~& E7 i // 接收中断 v" U+ W) y3 ?5 g. N% k
if(UART_INTID_RX_DATA == int_id)7 s8 o6 r* J* l5 y
{/ I% [; o5 T2 r- a' {
if(status_a0==0)
% u: M0 s* D0 E$ N; k2 R# { {( e0 I$ Y* |/ V: Q) Y+ }
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, q5 |; Z8 _4 E0 j6 u if(a[0]=='#')
- o) i) F* c, y' Y( A {9 O$ q/ n# Y* t( m+ O' g
status_a0=0x01;8 R h/ w+ e8 w) ~. x
status_a1=0x01;
& \6 G# J- C, [4 {) Q' C( T$ W }& b1 I# b/ k6 c9 B9 m9 v
}
6 T# s2 q9 q! Z v; L, X if(status_a1==0x01)
3 ]. c, r1 C7 q1 n {' P. H/ y B' N
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
: X; ~: Q8 F* f" v0 G5 u+ R0 o if(a[1]=='R')7 Y: Z' X" M/ I5 d
{/ f' S( W# y% ~0 o% C
status_a1=0;0 T6 W3 t# b. e. g/ o1 |9 [
status_a2=0x01;
7 s/ R5 @* x) `$ a; a: \ }
, f6 p* W# e: {) n) f6 J } s. k2 a7 u: n# o. j. j9 E0 G
if(status_a2==0x01)
9 v/ T, o& t* x: C7 l! J1 A {
. \- Z' r e; V# W+ S* \2 g: ~ a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* d% `/ o2 j- o. Y. P2 P4 U( i
if(a[2]=='A')
M* ]+ P1 E7 _: ]& ^* X {) a# r4 M; o- n3 f8 a; s
status_a2=0;
( C: [9 S: P+ L status_a3=0x01;
' i" s* e' ~+ h- `$ m/ g% E }
" ] O* ?' \; {5 v, Y }& `' ]" C0 |: o/ e2 E, e
if(status_a3==0x01)
( q7 J: X. k& m* S$ e$ `* E {
8 t/ S+ m' i5 @8 T5 _1 e# } a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 u3 R( k" _5 d if(a[3]=='N')
4 @* h6 `' E2 G* i" S5 O2 X; O {
1 K; Z! ]9 X0 G status_a3=0;5 {' [8 Z5 N4 m/ n& q: X5 A2 b7 s
status_a4=0x01;
5 M/ D. D% _2 E6 o3 i% y: w% @ }
( j; r) K7 S6 U. I: { U2 i7 C; M }
2 L/ R: }$ k; o) u o1 l5 t0 x if(status_a4==0x01)% K; `4 Y) U% P
{/ H* x: r6 f4 M4 r* i% {
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! N2 a/ D) c- P1 s2 Y
if(a[4]=='G')5 t+ u) a4 k! n6 D6 e
{
4 k4 C3 S" e9 _ e status_a4=0;% j9 ^4 h6 I" w4 ?' h
status_a5=0x01;" Z% r7 C A$ U1 G1 d4 L
}; R9 S" Q# H# G5 w
}
/ W/ |% M& }& w6 Z9 k$ a) y if(status_a5==0x01)7 c4 ]- a% ]) w3 _
{* c+ L# [6 T5 p- Y+ T1 b, U, ]
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 K6 K8 O; b# e: z3 R1 @
if(a[5]=='E')
, P4 u) o! T+ u+ C4 Z {
7 i$ e/ Z0 e2 J) J8 T3 O( d8 u status_a5=0;5 s( q# l4 C; S
status_OK=0x01;
4 C" a- [7 e. {% s5 W. k }
% w) o4 C4 J$ O( h; X; M }
9 J6 \3 X. ^" X0 }6 ~ if(status_OK==0x01)
" @: Z3 P( z- A! ]( p& R {# S7 r$ O& k: o4 y2 k( ]" A
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
8 J+ o* S+ [) ]! k$ `! l1 f lengthrx++;! ?# T2 Z; Y2 \* z* O: m' ]
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
, k- [8 r8 Z* b2 X( V4 g3 l {. ?% t: z9 U5 a% N. q2 I$ a! M( N; s' s
RecState=0x01;
) I# q( _, P% k/ a }
) c/ o$ r9 X; n' A }
- k0 `0 I) `. w. u0 {2 |
4 ?3 B& j5 z! R$ V }
5 `0 }" o! H" ~4 M/ i3 e
$ @0 t! G9 H* u' m# T; S& \! @7 z // 接收错误
7 ~/ f% u% C2 V5 i if(UART_INTID_RX_LINE_STAT == int_id)/ p/ S ?1 Y$ S$ v, L+ Y* L
{% g: p& ?( h' k0 E I( \' X
while(UARTRxErrorGet(SOC_UART_0_REGS))
+ U' ~7 J( ?& h8 ^ {
( U' g0 |" v" L1 S% a: x/ ~ // 从 RBR 读一个字节7 e% J; p+ W7 h, ^( H+ Y
UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 b- i1 @2 R6 F; s5 I }, |/ D& B; H! M1 l" \! R. _
}' Z. t+ V" x$ M1 l$ A2 A+ k
* _( a* t' V- i return;/ D5 _1 G" C; R! i* D7 }
}2 X) a/ B! z) H
2 O' J% T u2 k- o- W
% E* n" e# o0 i) u) O+ [8 M( Z
1 d, m" g+ h0 l3 i. g |
|