|
OMAPL138双核通信,现在需要DSP核中的UART0接口。$ G3 W3 Q6 c, {" R" ?
我是在DSP初始化这不太明白。( g7 G5 b+ F# T$ G: n) o
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
4 {/ s: d) H, d/ K5 Z7 D t( _ ^9 X4 ]& L* ?( P' J2 A- X
! c: R$ O: R6 W8 P
首先 PSCInit();//UART0使能
5 D0 o& q6 C1 v: zvoid PSCInit(void). y$ j: w' \9 i: u$ N
{) i" |# w, a1 ?
// 对相应外设模块的使能也可以在 BootLoader 中完成
- Q1 }' ~6 y/ G9 R. L& M // 使能 UART0 模块( U8 x" t* U3 ~0 m3 a, N" K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);3 ^7 C1 |. U0 Z$ [. P
}1 i) o9 b) [& ^! n4 q5 i
0 E6 L( \0 `: M. a; L. h4 ~' L: l" L) Q
然后是 双核通信的初始化 AppInit();
) h0 ~/ l, O7 ~& ]8 s) Xvoid AppInit(void)
7 F* W+ n) [( Q1 Y( E9 k: Y. ^{8 _7 j5 q p# I8 d4 p/ `
/* Structure to initialize IPC (see Ipc.h for definitions) */+ D7 W( J5 o5 v/ a" q8 d$ T
struct IPC_cfg ipcCfg = {$ L+ K9 W3 z5 t n; c$ V
IPC_DSP0, /* local processor Id */! E8 z7 G$ a0 }1 w( c6 F/ S0 v
IPC_ARM_HOST, /* remote processor Id */
5 }5 h, Y, b' F5 F3 t0 R( I6 t IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */! Y2 {6 o# E8 ?/ ^! X1 z" m
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */8 o6 O; e) p1 J! b
NUM_MAX_EVENT, /* maximum number of events to be created */
! S# X4 d$ e h! \ I# h+ i &ipcPvMemDsp, /* local side private IPC memory */* ^! e. o% r# h. }, N" z
&ipcPvMemArm /* remote side private IPC memory */
" U6 C# G4 K# _, z* q8 R% { };
& ]9 E" I$ a' P( i! k p8 i8 P IntDSPINTCInit();2 l2 f( _, w( D$ J# x- r* ?
IPC_init(&ipcCfg);4 e4 [4 w, |0 a6 |
IPC_intRegister(C674X_MASK_INT5);
1 Q2 J. y8 E, x- O" ]- y5 E9 g+ { iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));& ^ x1 s: |$ l8 E, Z2 m$ C
9 X/ ^3 S' s: D, H$ ]( F! q8 X, p
/* Enabling interrupts for DSP C674x CPU */
' f& ]- P7 I5 V, G IntGlobalEnable(); /* Enable C674x global interrupt */$ N, _3 W" @! u% p, k4 S9 o1 h) k
iAssert (Notify_start()); /* This will enable IPC interrupt */* \* }6 x7 j s6 N2 u
}) v. L: {- ]9 A
7 v# p8 Q2 j4 a8 i( T y" e* z
然后是 3 i1 v. g4 ^/ K4 l
// UART 初始化& L( d7 I) ?7 [/ f! k+ \) P
UARTInit();% D* A5 {7 x, x% i {0 N# W g4 j
0 G& N* G% M+ a
// UART 中断初始化0 k1 U+ E/ M, X Q+ j
UARTInterruptInit();
# z/ m, R- C) C+ ] b4 @ p/ {" d7 X( e; X$ N6 Q+ u0 E
& _3 b9 ^# S2 H! b
void UARTInit(void)
8 h, h! Q# C& d/ _% e% t5 m{9 K& q n* p# A; t+ h! Y
// 配置 UART0 参数
4 { Z+ t9 o4 f6 w7 h' w( h // 波特率 115200 数据位 8 停止位 1 无校验位' t' t$ ]/ u( t( {
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,- X9 B2 Q d) W# F+ s2 d0 c8 ]
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);: s3 r" F1 g2 Q' k+ E' n/ k: B4 u2 @
// 使能 UART0
) |. W5 Z- ?3 ~( H UARTEnable(SOC_UART_0_REGS);
- \, c# i- b; d9 x" D8 W; r
- h# v0 ~4 B7 Z4 y // 使能接收 / 发送 FIFO x+ n. T/ i; J+ {
// UARTFIFOEnable(SOC_UART_0_REGS);
2 t$ M- X z# R$ R+ u' @- A0 T
% d7 J5 O6 O% o! d' L# y" P UARTFIFODisable(SOC_UART_0_REGS);
+ Q( A0 Y- a' S( A* i
7 r3 ~& n% B9 \9 x/ O$ I // 设置 FIFO 级别 接收FIFO的级别
2 k. t* O5 O) R# z# s, A/ Q// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);; p# a$ i7 c6 v' u
}
2 c8 T& ]5 @) `1 i
5 n: L" `9 U7 }6 O" p3 ^7 t
9 k6 \, ?0 D5 `: S) m0 r! g7 }void UARTInterruptInit(void)
, t w h b+ t9 F& w8 Y* ?3 X{
9 E; A7 m+ T0 A* l IntRegister(C674X_MASK_INT4, UARTIsr);' ^; W8 y' `1 n% X* ^! ]
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
: E% m( x. \+ `. Z2 P4 b IntEnable(C674X_MASK_INT4);1 L7 p& ^6 j! Z7 |" H& u0 v! T0 D
9 ?* |1 W- r! i1 J6 B // 使能中断
3 ~6 G! C1 v- m# Y/ k) e' u unsigned int intFlags = 0;
d! h: G& K& D5 c0 _9 a B' ^* e intFlags |= (UART_INT_LINE_STAT | \
7 V, Z$ n8 M5 m7 a1 K UART_INT_TX_EMPTY | \2 d+ s. w& Z" }
UART_INT_RXDATA_CTI);( V# k6 w. ]2 n
UARTIntEnable(SOC_UART_0_REGS, intFlags);
2 N1 T3 O4 Y5 x/ C# U}
$ h6 s; E& R0 R$ t) K8 ^0 }; K0 l/ B* D8 ^( ?9 W
0 f0 @- G; v0 b5 S" S. \ Hvoid UARTIsr()
; G/ p$ Q$ b2 u8 b$ X v4 P{
; k) \& R' [9 j5 K E% P2 V5 C static unsigned int length = sizeof(txArray);
* \6 l' x K" Y7 K. z static unsigned int count = 0;
5 f) H I2 e) G unsigned int int_id = 0;
0 `+ ]2 m1 n/ Z$ z& ^6 P" h0 x
f5 K& J/ T6 \) ^
; p1 ^6 l {: f: i, G1 C2 W
5 f5 k4 N/ w! d, E3 _) W // 确定中断源6 x% @: u) v; L. L% W( T( g* s
int_id = UARTIntStatus(SOC_UART_0_REGS);! `; V0 g8 Y# L: h
" ?1 k: t6 I& P2 z
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。" ~4 A( Y' W2 ^1 }+ Q: E
: O/ B( ^" I$ i* y% @2 I
! V) \7 Z+ g: D // 清除 UART2 系统中断
/ Z9 D; y& {+ P+ k3 V) { IntEventClear(SYS_INT_UART0_INT);# i! V! k! c: ~6 P
0 V" l9 n( W! F- ^* T2 L" S2 m
// 发送中断
. p1 D* J8 B: }+ H if(UART_INTID_TX_EMPTY == int_id)
) I( D+ l7 h. x M: U% Y+ e6 e1 Y {
4 b9 `" b! R1 R6 w" q- k( g if(0 < length)
4 v9 q N! f; v8 d# M' _ {
) m" o. w9 O/ S* w1 Y/ X/ Y // 写一个字节到 THR4 Q4 w; O' L2 D- b! c
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);' F- Z$ C0 n5 n' d( F8 \2 m6 g% C k
length--;
' C4 b% P5 A* Y4 _! X count++;
) O6 M5 A0 I9 } }
7 f8 h0 r; Z, `0 Z if(0 == length) x; `+ s K4 F( S
{
9 i2 i5 D1 x4 `" s! K6 [ // 禁用发送中断
. T! X! ~0 _: c& J8 E UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);8 s# ^; x; a! x6 e
}
- E6 @+ f, c E7 h/ v& I1 ? }4 ?+ e( E! n3 J2 W% x0 ]) S$ |
) A$ r: u. T& R' ?, H; l
// 接收中断7 }: a0 \( t" V
if(UART_INTID_RX_DATA == int_id)
, l/ ^: a! L; j5 B! `+ R {
. m1 F2 O# @* N9 j if(status_a0==0)" @& J) k7 ~8 G* b0 a! H
{
" D" n% o! m% b; e2 O+ r a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
! u5 V$ M% N4 z0 s if(a[0]=='#')
: p. m- z8 e6 H( O( J$ G {
! [* q' a$ K2 K& w7 q status_a0=0x01; T# a' Z$ \+ _9 Z& R
status_a1=0x01;
: g6 A ]* P8 h }
1 ~/ \, _7 \7 b( R& C4 t. {5 L }( \& o& h0 N' _) X) J4 ]1 \7 \
if(status_a1==0x01)4 T+ ^, ?$ A5 i! Y1 f5 U% C
{# K9 Y2 f6 |5 f5 A+ n$ M( |
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);2 ]% z/ _. t% Z* [$ s* O2 t
if(a[1]=='R')$ [' Q" q5 L0 H" H. A6 F( ~
{
: c" I* U1 [9 @* E0 m) @3 R( g1 ^ [ status_a1=0;, X/ a4 P# o y+ i
status_a2=0x01;
9 e) s+ g/ n4 q: ] }
: e! w$ k3 E4 a3 w- G0 C: j }
! P! O6 J, M( I4 z) _ if(status_a2==0x01)5 I: m2 O, H0 q8 S- ]% ]/ m& L0 j, t
{+ L* Y( a2 A5 n# K
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; }; `+ ^! e- g2 C" M+ C+ f5 y0 m
if(a[2]=='A')
4 V1 P" N. ?# P5 @) x3 S* G {& t: Y1 g2 I+ E0 R
status_a2=0;
- C& Z7 M6 ?* U' M7 F status_a3=0x01;
, C4 v# A6 p9 i+ j* q: p; ] }
& W- h8 C3 C, e s }
" {% C$ N9 F/ ? `4 {5 I if(status_a3==0x01)
" H- T$ q$ W/ {% I7 p {
`. H1 N) b5 j) v7 @ a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 x" X8 ~5 ? C1 F if(a[3]=='N')
! }0 e+ B; N# G {6 u" f- O4 D5 m4 b7 V( l
status_a3=0;- m) G0 i+ O' m) d8 p& R5 v: `1 |
status_a4=0x01;6 P T8 ^( n4 M: h5 K
}2 _2 t3 k# ^( J! I' D
}
# ^/ L( R1 g2 { if(status_a4==0x01)/ b/ ?4 `* G7 `5 K# F: j
{
* ?0 k/ d5 x" K: \/ N9 \ p a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- r0 u& {" F8 O* Z7 x
if(a[4]=='G')- o2 i2 A. q2 {. G* U, ~# o
{. \9 p( G, P/ e3 U# x
status_a4=0;
. q! f! [% B2 ` status_a5=0x01;* ]4 H E: @5 M8 d# R3 k2 w
} y5 x, g: M, {. n8 W, _# C
}5 p. ~" J0 d8 ]
if(status_a5==0x01)
3 c. _6 k" f" A7 T {
7 q2 ]$ m; ~) P a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
" c/ S: U( _5 {& d. ]5 s! A if(a[5]=='E')
. }; i% y; B. g; ]4 q9 B8 d {
9 ~, ]) B& N5 S, ]' u; {+ B status_a5=0;7 p- {) A* _2 B; _0 R4 B
status_OK=0x01;" U& S+ @& _) F' ?1 M
}( e( L% p% w5 W6 s: E0 `5 d
}0 T7 B3 r$ E: P0 _' E. V8 f/ ?
if(status_OK==0x01)
% [$ w% Y1 M5 ^" [, q$ M( O5 B {. F' M5 D( {+ B R) ^* k6 B: d
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 U6 i8 c0 q) b2 x lengthrx++;
v: [2 ~# L# _) [8 ? if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
2 Y$ Y* o. ], }- r5 Z, O1 E/ G {6 D& Y/ J' ^: a2 _. @5 g
RecState=0x01;6 n4 r0 T5 X( E) d
}6 }# f6 c5 Y$ S5 F3 @9 i
}
" o4 n8 p# r9 a+ _: G9 N c& N0 m/ o+ G
}
3 u8 R3 D# e& Q8 v6 K$ q
" [1 K( c) U! r // 接收错误
- x9 M4 X: ?- L6 Y4 P9 M7 H if(UART_INTID_RX_LINE_STAT == int_id)
! }! O* ~6 z3 H, u/ c# I/ f! _" ? {, ~5 t4 Q9 U& |: S2 @) T
while(UARTRxErrorGet(SOC_UART_0_REGS)): L( h4 E" k% k
{
m# V, V( v# ^% Y. i // 从 RBR 读一个字节
6 V+ V1 d1 f1 W! ^2 I. ~ UARTCharGetNonBlocking(SOC_UART_0_REGS);
% f( U0 q1 e' {0 f }1 k7 D# u. ^6 H5 a% h7 [! X: ]
}
+ o) c+ r. {4 b/ C
K- |1 s8 E1 K/ x' U return;2 W3 c( r3 I l6 j$ f9 {
}
1 [# ?; \+ \/ G/ y* H
) ~' e$ d( [4 s) l) b' s7 o
' V; k1 w8 Q5 G, F( V6 g/ N& ^- t0 Z; k7 m
|
|