|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
& g% d/ y$ @6 Z+ `我是在DSP初始化这不太明白。
" m7 Z5 K a2 D, Z初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
+ s5 {% O' X1 v* o+ j, g9 L0 ]& |% A* v% j3 G' I
3 c! C& }" h. m4 l2 ~8 e6 q$ q
首先 PSCInit();//UART0使能
8 f8 T. [, u: k9 K' z1 Pvoid PSCInit(void)5 w o& N. o0 c: G
{% q: u, g4 R# K
// 对相应外设模块的使能也可以在 BootLoader 中完成. x% O5 W7 x2 n; ]" r
// 使能 UART0 模块
4 g: A2 {& `- T3 ^+ e: o+ d PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);% F+ j! E& D7 r$ H" k6 h- P7 K7 @
}1 E$ c/ U# A$ [* c$ ^: Y1 A
) L' p2 M! E2 c0 g
1 Y; \# g. |; |% H然后是 双核通信的初始化 AppInit();
, H# [8 Y& i4 `void AppInit(void)' \, b7 \) c+ v" f" D# T
{& F1 J) }$ T0 R. F8 g, w
/* Structure to initialize IPC (see Ipc.h for definitions) */1 ^! g5 X D8 U, u! Z9 ^
struct IPC_cfg ipcCfg = {7 o7 J. ]) X; \/ F/ W8 }3 x: F
IPC_DSP0, /* local processor Id */8 o" j: ^# ^) u4 y+ [: e% D
IPC_ARM_HOST, /* remote processor Id */
4 W& |, U2 Y- a0 m0 O IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
& e( k4 Y; D* d1 b7 K1 A# A: h IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
( U9 I0 ?' J5 R6 T0 c NUM_MAX_EVENT, /* maximum number of events to be created */) D: q2 d! ?5 c! _! H4 u/ @: h
&ipcPvMemDsp, /* local side private IPC memory */ V1 ~( n% h' z
&ipcPvMemArm /* remote side private IPC memory */0 K1 L. ?# {* D) o
};. d3 L' e+ v. _
IntDSPINTCInit();
! n+ X3 }+ k/ b. d' K6 e- I IPC_init(&ipcCfg);
# C4 K5 d: ~+ T1 e7 x1 j IPC_intRegister(C674X_MASK_INT5);
2 W) W( J- [1 w# w. d iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
9 @5 E9 z3 h# M* f; I* O- B, i0 f/ @, g
/* Enabling interrupts for DSP C674x CPU */
* w5 m. ?2 {6 I% Z9 c$ y; m2 J IntGlobalEnable(); /* Enable C674x global interrupt */. p a9 c; j3 L/ a y$ r
iAssert (Notify_start()); /* This will enable IPC interrupt */$ s7 ?: E1 P7 R. D4 s
}
$ B# |' J1 T1 x" s/ P' S$ Q, I. X3 r+ `. H+ \
然后是
$ a! i8 l4 o; c$ [0 p: _ // UART 初始化0 Q- {$ G# X' ?7 O6 H) p& v3 q. s
UARTInit();* e: g" w% x1 p3 h
+ }1 Z5 K0 \4 S N- \) z // UART 中断初始化( B( P6 C* M6 z7 \5 M4 S! m) c8 _1 E
UARTInterruptInit();
1 M" _% O" H: K- x! F/ s
V c; x8 I3 K O: ~$ Q2 p0 c# E* v# U
void UARTInit(void), C# Y: X0 l8 ?$ a1 w
{
; `$ K2 E$ a# [9 h6 p, ^ // 配置 UART0 参数' X. d' y* F& a
// 波特率 115200 数据位 8 停止位 1 无校验位+ V# \# f5 Q7 P8 H, `
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,7 Y, W, u/ X8 i5 w! \5 q
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ r5 }& S. t8 I/ O9 K. H
// 使能 UART0
5 j) n) ^. y9 ^' O: ]' F UARTEnable(SOC_UART_0_REGS);
+ g& W4 T j2 G4 S$ r
: c% W3 H$ D E. T. K9 a a // 使能接收 / 发送 FIFO" [( o& W9 t6 U, q1 @& ?
// UARTFIFOEnable(SOC_UART_0_REGS);
5 T3 x4 N) s1 ~! d4 \! x4 A
. k$ y! ~5 [9 o; L UARTFIFODisable(SOC_UART_0_REGS);- ?# h" Q% w+ d2 e) Z, @
' K( W$ t: f6 v/ z8 }+ C+ ~2 c' f // 设置 FIFO 级别 接收FIFO的级别
) B N* G+ C3 {4 V# H) |// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);. M6 x1 W; y% N4 {, k
}! o7 U. M* I: ]$ `; Y; \
3 ?2 k0 n Y' _2 W) O* K+ b
3 Q: @4 P0 M( O; J, Nvoid UARTInterruptInit(void)% s/ _; {8 @( d8 X' a, [+ \1 ?+ {
{
# ~- u3 \! F# W8 u9 g& H2 C4 W IntRegister(C674X_MASK_INT4, UARTIsr);
8 M4 `7 z0 j! S8 k3 L$ f IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
/ V/ w! Z& \- W% [ v8 J) L- g. m IntEnable(C674X_MASK_INT4);
; `9 j6 M U: s) v+ H4 |
0 p' d7 ^" o4 z2 a( h5 n // 使能中断% c0 U; n' C" I8 B# M% Z& r
unsigned int intFlags = 0;: w' `+ ~9 T; E8 r* E0 A+ S
intFlags |= (UART_INT_LINE_STAT | \8 S q8 U& \+ J7 `2 _2 \
UART_INT_TX_EMPTY | \
$ K1 D) k6 D5 g UART_INT_RXDATA_CTI);
7 V7 P$ m$ C7 g# |, z UARTIntEnable(SOC_UART_0_REGS, intFlags);: e- ?5 F) q$ I" D
}+ \& k1 f) w9 q4 c, N- \7 d
`! ]9 r& v9 R" u0 E
6 S2 S( J p9 Vvoid UARTIsr(). i1 ]4 }8 W- }% I! B. u
{
( `5 b& V2 k* k! ^% d: e static unsigned int length = sizeof(txArray);
3 O! c3 ]9 R3 T* z1 q9 e2 \) T static unsigned int count = 0;
3 N. a/ K9 t o* \; G! h unsigned int int_id = 0;$ `) h) M( @' T( A$ v5 Z3 W
2 |$ c3 \, P4 C- K/ E
/ A. r% V2 e+ C& p" W& x
: u+ a3 G$ b3 p) a" ?
// 确定中断源
" p/ M# O4 K& i+ ^2 A% M" D+ {/ W9 Y: h* { int_id = UARTIntStatus(SOC_UART_0_REGS);, I0 v0 t! \3 z; P. v' N0 |( _
" y3 ^' h) ~4 e) x
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
1 T3 s; M2 L) k4 _
) F0 c& _9 h$ S7 }) V" D. b. H3 e; h& a* O! z
// 清除 UART2 系统中断, j" o# Z: ^, d' a
IntEventClear(SYS_INT_UART0_INT);# E# N9 S" M8 Q' h$ e! m
- N. h J: {5 W( Y9 q# i // 发送中断9 X7 {1 S0 d" }! x0 K
if(UART_INTID_TX_EMPTY == int_id)# a$ s5 K; I: \6 C0 k8 G s) D/ Y
{6 r/ k* k* r6 o+ f
if(0 < length)4 E+ I' H- m. w# L
{
* j% d3 K) C* p z( | R: j // 写一个字节到 THR8 O% y9 `+ j% _7 Z2 Y+ e; M5 ^9 |
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);; E4 v% E' m0 U' \* {5 |4 i" N+ S
length--;9 K$ V$ S# G1 R0 V" t: D+ }
count++;7 Y- N Y7 s( {
}6 K% V2 Q9 R! k) ]" s) e
if(0 == length) X2 h' }7 {! E I7 E& u
{& Y* Z# Z" [: x' p# `$ E
// 禁用发送中断6 }# y& L3 N+ V; `9 Y$ v8 j+ D8 f" R
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
9 F* W Z! y" A7 S" H9 J }
8 L1 L6 w: J! s0 c% n/ ? }
( e; v$ b( }; f5 e" R+ \
u2 Z! j% |8 s! }- a; k' l // 接收中断, j2 K% c4 |- U
if(UART_INTID_RX_DATA == int_id)
8 c% `, P8 F( D8 o% G, O9 A {# y, d* d! m. Q
if(status_a0==0)
@, E7 V% v" s) H- A/ Z4 f2 ? {' N6 H1 _3 w) a* h l5 }) g
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS); m5 p) t: Z- y. d9 B& W
if(a[0]=='#')
! \$ S8 R" e4 B5 k- e {
4 @6 B' ?1 W# W! W# M. y9 }# q status_a0=0x01;
/ S- O7 u O3 [7 n status_a1=0x01;
2 J/ I) L4 u3 K& U- F% e5 Q }
4 B3 f& E. A/ U }; t+ F; }2 T$ m# x; z
if(status_a1==0x01)7 @9 D+ _! h% ~1 _
{
; A. } N! U9 D* ]1 P5 h a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- M( y# o+ X+ x9 \3 F( k7 v
if(a[1]=='R')
$ J. [7 P2 ?) S- G9 H' e a2 p {+ w0 A- a9 [( D2 ~
status_a1=0;
4 F- S& a1 V1 g% Z6 I1 D status_a2=0x01;
0 o" c$ Y* w: i( Y8 x. o r$ N }
\7 v. E7 L, y3 U4 G5 z }
$ Q4 i1 k+ n( l if(status_a2==0x01)
+ @; o, X3 G$ v* s0 Z4 i {
6 i* a: j" X) F; U a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* \! g8 e" }, y. |
if(a[2]=='A')9 x( C9 \8 o( x8 v3 q' [9 d
{
, I; U4 }: W9 g: g status_a2=0;
3 r9 S4 j4 u1 w; V8 j status_a3=0x01;0 }; _3 t) [3 g7 Y
}: j) J1 u5 H* g4 Y m9 z! w; e
}
3 l3 p2 N# R: |2 D if(status_a3==0x01)8 Y+ Q7 t+ ]$ x/ ]% l' E
{6 G- B5 Z* b( j
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
9 i: \5 Y% ]0 k. a/ N if(a[3]=='N'), B$ j. u8 N5 b
{
: [1 X0 j! z n% w- X { status_a3=0;
0 Y- D9 W8 b$ o4 ^1 x7 M# U U status_a4=0x01;- Y! Y1 I3 |4 z' k' H
}! n2 ~4 q. q6 s& Z# P% w
}
4 o& ^, K6 ]$ V* @ if(status_a4==0x01)
! s* `& X. s2 Z {7 O7 |% r! c0 Q2 M8 S9 m2 B
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- V% J/ Y- ?$ b
if(a[4]=='G')" z+ b2 @/ r l1 n
{# R& O; S H0 Z3 q4 J9 q+ `1 O3 a
status_a4=0;4 h& b6 ]3 j- A; V8 ~
status_a5=0x01;( x. S3 ~1 s! x+ O0 X/ a" s
}
0 R. L7 y4 u5 a+ _' K2 c Y }4 g% j9 A3 ~6 h- }6 L: X
if(status_a5==0x01)* p2 t- j+ F) h# `2 Q
{
$ G- F& s% _) W5 k9 f* z a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
* I% L4 A' \4 C# ~% \, a if(a[5]=='E')
7 ~' ?* Y9 k% v9 {/ K: I r {- f/ ]$ p( a- p2 Z- K
status_a5=0;
0 {" D0 u( X0 N0 z status_OK=0x01;
! f+ ~/ U$ C% U1 i }
3 O8 x. S% r" O( r6 D+ m }
/ K3 `! r) n/ X3 \8 Q if(status_OK==0x01)8 q+ T, L9 \ q4 K. W
{
9 }2 w* q! ]) J rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# [& r1 e) m0 R9 b1 j lengthrx++;
8 h: W- u: C2 p* |9 S9 Y if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
4 P7 Z8 V; F! J( l. W2 y {
( y( t, M$ E. k8 \, j RecState=0x01;8 H2 A5 k( _4 d5 a U) a) |
}
; s3 |, ]6 b6 u, ?+ V. E }
2 H" Q3 n& b. A0 g, a
. e, ?9 n6 N( T% E( F; r7 K; E }
2 @9 Q9 }7 T; V. c7 ^$ {) C/ h2 d5 b
// 接收错误5 z: z5 ]5 p* E; n& Q H
if(UART_INTID_RX_LINE_STAT == int_id) I/ L: \; v$ v, L
{
" j' P; L8 w) B& }! B( t8 p- ?1 M3 O while(UARTRxErrorGet(SOC_UART_0_REGS)): |% K3 ]2 J- k, D9 }# x
{+ A+ y1 H, |: G- B1 S
// 从 RBR 读一个字节
. }. @% |* }+ p UARTCharGetNonBlocking(SOC_UART_0_REGS);
+ p4 P( T+ ^# S4 D/ t }, K" B: H( e# R& |+ l
}* T: w* Q* h2 k1 e
$ i* Z3 |; W9 A. c) _& u$ o
return;2 e$ G: Z) F: ~" K5 e9 ~
}
& E0 A: c- W8 ]8 |4 c- {8 R# A3 j, ~& z8 ^- }7 X% O
& v5 K+ J, t8 k8 N1 f
6 A8 u8 Z5 G" k' [ |
|