|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
+ q; ?& k& p" ~) x9 ?# f5 R我是在DSP初始化这不太明白。
/ W: `0 n- H3 Y* B初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
4 _8 b3 {9 N% v
7 U0 I8 N/ a8 g6 m5 t
3 o$ M, S" T& @+ M/ j1 ?) f首先 PSCInit();//UART0使能* R2 E% G$ X5 J/ W
void PSCInit(void)
* ^* _, i! R' @: G/ S{
3 M, g8 S! m5 @ // 对相应外设模块的使能也可以在 BootLoader 中完成9 |% N1 ]: h& _( I' S
// 使能 UART0 模块
: v1 S2 A' u0 R& a. R- n PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
1 S2 i2 d7 f7 f! A; o# `0 G}
& N- n- g8 ?" D" W: M* U$ M# r- @8 Q
; P# n, u/ u1 _! j然后是 双核通信的初始化 AppInit();
, n! ]% Q& @( y; l1 Rvoid AppInit(void)1 V0 ~ @! }1 p
{/ X* T* N1 k4 ]% P6 ?1 i
/* Structure to initialize IPC (see Ipc.h for definitions) */
3 d: H5 v- F6 P/ h- s struct IPC_cfg ipcCfg = {
7 x/ M6 C3 p4 a9 u7 f$ F0 b g IPC_DSP0, /* local processor Id */( K3 d% F% p1 f
IPC_ARM_HOST, /* remote processor Id */
/ b5 w6 n* d2 `4 O IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
: j) Q1 s. ?7 x6 r4 G/ g IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
) L$ R+ o; |# A3 K+ i I NUM_MAX_EVENT, /* maximum number of events to be created */! l% u$ g9 j' S" f- U {! U
&ipcPvMemDsp, /* local side private IPC memory */
4 q5 d5 z( _1 p5 |* G. p2 [ &ipcPvMemArm /* remote side private IPC memory */
$ L8 Q3 l1 B, b7 S# A x };% C+ V) ?* t8 R& \; E y
IntDSPINTCInit();, B' v* o" q. h
IPC_init(&ipcCfg);
5 E( O' N6 o! F0 } IPC_intRegister(C674X_MASK_INT5);3 ^" c+ h8 e2 @0 R/ V
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));" B; J6 \: K0 d/ Z; Z
+ m/ e1 s2 }- Q/ x7 S
/* Enabling interrupts for DSP C674x CPU */! `$ w. I! |* B q1 ]+ J
IntGlobalEnable(); /* Enable C674x global interrupt */# A; g8 `/ `# n4 S6 w
iAssert (Notify_start()); /* This will enable IPC interrupt */" ^/ r* V8 G8 I+ h4 J8 P7 n! k
}
6 j1 D2 K. T/ R5 _) w5 R3 H0 `$ |# C" i( _
然后是 4 ]( N- m% y% `# j* r
// UART 初始化/ }; a. Y; Z& B$ L1 Y- @& q
UARTInit();4 E- N1 q: B1 x3 _6 \
8 O O( ~" s( [2 z! v# i9 E // UART 中断初始化
. |* V6 I/ l H' y# I UARTInterruptInit();
3 U# r4 Y7 y8 i8 s% \& M
( T. q4 k y, S0 `/ p; S- X
) Z% b; I! x$ E+ l$ bvoid UARTInit(void)
I% z' C8 q# C- t- U, |{
- K5 _4 C# X% x' u- M5 g) t* { // 配置 UART0 参数
+ J! g# e2 ^& J* Y- M // 波特率 115200 数据位 8 停止位 1 无校验位
0 F5 w5 `; [8 u1 S8 ?# q UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
5 d0 G3 d; k: v$ B UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# y3 |$ B k: K4 K$ x // 使能 UART0
9 Z' c8 P ]1 w' E1 y UARTEnable(SOC_UART_0_REGS);" }6 @' u1 O# X& S/ X$ d$ c5 x4 f
& e |' E6 F9 X- q t7 J; g // 使能接收 / 发送 FIFO
% ?6 M S0 a& {) Y, V// UARTFIFOEnable(SOC_UART_0_REGS);5 t& V: b+ W' Q' t
6 B# e5 K' X; O0 S6 T+ J& m1 u UARTFIFODisable(SOC_UART_0_REGS);% S9 g% A, ^& p$ I
6 T* H2 a! q* c& Y4 `" W
// 设置 FIFO 级别 接收FIFO的级别
' K% k+ [$ v q7 ~4 h// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);. K$ Z. ^6 H% S" H+ p( W
}0 o9 u- {: y& l5 a
# M/ T, w, t- O5 [ I
+ W x4 l* a; v1 T7 X
void UARTInterruptInit(void)0 ~# M1 R5 k0 X) z9 T
{
3 r: I, ]. X* X: |, q6 u IntRegister(C674X_MASK_INT4, UARTIsr);
8 C$ }5 G0 d1 l9 P! }$ P IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
0 G; ]+ w. V9 B- G+ k3 F IntEnable(C674X_MASK_INT4);
# `8 ?. S' f: [( M) v$ x
9 W5 _* l. A5 t$ o4 y/ f% z6 | // 使能中断
" Y+ y4 d! S$ d) _ unsigned int intFlags = 0;0 s* ~8 R6 ~, |* B7 [3 G- w
intFlags |= (UART_INT_LINE_STAT | \
0 }7 l& r6 X; h. N4 G2 v4 I) J UART_INT_TX_EMPTY | \
* \8 {; o- B; y6 Q0 w UART_INT_RXDATA_CTI);1 B9 u' P2 w4 F( E8 o0 ~! \2 `7 S
UARTIntEnable(SOC_UART_0_REGS, intFlags);
% j& d1 \; r }1 t" y7 M- U}
! s3 @. @$ q; @6 T; n, _5 h' Z4 ]. x5 q
$ [" G; v: X! M0 u
void UARTIsr()
" i( g- R0 ~. r7 [% o{# O+ j- t/ ?! B9 l- a" E
static unsigned int length = sizeof(txArray);
; T) A" n3 o6 z1 U+ j+ P static unsigned int count = 0;
. c3 t* p% ~4 a6 A unsigned int int_id = 0;9 g* j) l# p2 E" v! A% n
/ s# M& n+ x q2 F- {. s
' w! O1 X. F4 i2 E8 K3 {% M- J& s8 k) m0 ]4 s) C0 L" c: |
// 确定中断源5 Z5 D% F/ m4 A5 }' ^
int_id = UARTIntStatus(SOC_UART_0_REGS);
1 a3 {) P" r' }
2 f1 e0 D" z( F+ d8 `9 \ // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。) j G( o! h7 X
I0 F5 Y/ P+ H
/ z8 \; F* v( R2 J; |$ t
// 清除 UART2 系统中断
% A9 I) Y/ }# h8 Q) \ IntEventClear(SYS_INT_UART0_INT);
/ e1 i$ D. h6 T# {- j8 q4 P3 D# q5 t7 E
// 发送中断& ^; `; c' H i3 I3 O
if(UART_INTID_TX_EMPTY == int_id)
" {" P( ]8 q: F {
, l' f/ t d0 x* C3 ?3 z- W7 ` if(0 < length), C b6 K6 G6 k4 y! ~
{+ r0 k7 [7 D1 C
// 写一个字节到 THR
3 H w4 ]8 m: S4 c UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
- F! r+ t1 n3 t+ A( \9 U length--;/ M ^* u) M* s, F" C. t
count++;) b+ a) s) S- v* C$ m( \1 w
}/ ~, u* A) E2 a1 {) D
if(0 == length). b7 b1 F- C4 s; c N" v0 }# u
{0 a3 z1 l; } x! i: }, e
// 禁用发送中断- Y0 [8 C* T2 p2 T& }# `# ?% K
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
& R8 M4 K( z8 q2 x }* `1 X3 ~6 Y* r: R! \
}7 _' d6 N+ v; W3 V# ]$ B5 _
2 ^" e7 v! R. k$ ]. V% |5 d
// 接收中断
, G4 @2 }3 f) r if(UART_INTID_RX_DATA == int_id)3 m4 n) j2 Q, j
{8 i" U7 K+ W) s: ^9 k
if(status_a0==0)+ @2 m! r. u0 u. D" C4 @0 l
{
% g) y0 F4 [/ E9 T B; i a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);+ x% u1 u/ d% J5 a" s
if(a[0]=='#')
( d- |, `! d$ v$ y {
2 P/ g3 h+ ^4 }9 i- |* |, y status_a0=0x01;2 C1 T2 T6 c: K" K' d% [) x
status_a1=0x01;8 e3 B d. j0 k5 A; U2 {% M1 K$ H# d
}
, U+ b$ I# q+ \$ J0 }7 q/ j% |0 d }8 n% C z- W1 U6 r* I4 g
if(status_a1==0x01). \& f$ i/ V) Q. @2 w" ~
{' U Q5 B# F& N( C3 ?" `' R
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 d2 K2 r, G* U1 }9 J if(a[1]=='R')
% X4 q& X H2 z, \9 O {
. f8 R% S( g! ~4 n2 D% f3 K status_a1=0;* x" u& c6 }5 {' r8 |3 |5 Q3 s% P
status_a2=0x01;
& V$ z/ g, I6 i; G }
6 i8 j" n. ^% A v2 a2 s }1 x7 K! z7 c- L' a( U* A
if(status_a2==0x01)
: b" B) n% e g% T8 I {1 C& G, Q& t; ^0 T# D# }3 Z
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# r0 [& m& w7 Q2 r9 t+ ?7 _
if(a[2]=='A')7 f! }- }" Z- k$ G7 M
{
- c" y: j4 s% e3 V1 ?! j. R status_a2=0;
+ l0 J* f: o. I. i Q5 p status_a3=0x01;
5 Y: u9 v: Z# c3 ]/ L) w9 |: d: `% M! s }8 p) O7 T. g$ p) a- O
}
, P( k, r3 i8 x0 _. Y4 ]4 P0 c if(status_a3==0x01)0 S6 z; l' Y8 r# D
{
3 ?6 n- e( z: _! w# v5 Q a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
" o- i7 Y2 b$ r9 e if(a[3]=='N')( v5 O2 F5 G; h, \) w0 {
{ \2 V# g- W. ?
status_a3=0;8 N* K* u" o: S9 n; H3 f
status_a4=0x01;9 H- g7 ?" v% m4 j+ t* \
}; }; N+ D2 t& Y# X$ s
}4 [4 u! c; U/ M ?: ~
if(status_a4==0x01)
4 n3 |: F6 E5 ]# M0 I: |; T {
6 Z( W h) D7 O: X% y. U$ b a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 Y @5 g& ?' N/ w' L4 D& X' v if(a[4]=='G')
$ z6 R. f n1 t' l" h9 N {
8 c1 X- M" B* B status_a4=0;0 f4 x7 h5 R( \; k& Z+ t8 c6 o
status_a5=0x01;, d0 M _ v6 |2 m1 W: {
}
* a; @9 a* G: z7 `0 ~ `% [9 A' B }# X" K: a. |1 h) l7 N0 a) u
if(status_a5==0x01)1 G1 q: D, L$ z0 X Q/ A1 D
{& N' ?6 @4 E6 ^' I5 d/ w4 E
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; o, R3 c1 U$ p) a! p1 X if(a[5]=='E')
, Y; m: W7 Z. @. W+ p% ? {5 K! t) F" K5 c3 q/ p
status_a5=0;' S$ v* F `( c. S! H: [
status_OK=0x01;
" l# f0 J4 Q, S; y" U/ C6 W) d; D: P }
+ K: @3 Q# ^/ `# C }
3 }. B% Y1 X' ^& v5 L# N2 e if(status_OK==0x01), t7 a3 ~ ] \$ ?* @5 Z r/ V
{% x" Q6 @% F3 V/ B
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" a. p, N q0 P+ l" {
lengthrx++;
5 W7 M. Q: x* R7 a if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)6 J: r5 y8 E4 |1 M, O9 K
{
. n z9 F1 h8 E0 l6 h' J RecState=0x01;
; O/ v8 F" T! D0 x/ c }2 o. i1 ^' _2 p, m: ^. v: J2 x" I
}* O; v1 |: y4 r) K8 B
6 c; Y; M m0 b% z# ]( w
}
3 y2 s2 V# i3 ^ x" A; L" @* Z/ `( P
// 接收错误
8 J# H8 @! u" P if(UART_INTID_RX_LINE_STAT == int_id)9 M3 u. N: D8 S! [% y# i% c
{
" n# v+ M7 S8 C2 Z! F while(UARTRxErrorGet(SOC_UART_0_REGS))# K8 t; m- V* e% i
{
* B o& i% o" b t // 从 RBR 读一个字节
& x2 _6 T x* ] UARTCharGetNonBlocking(SOC_UART_0_REGS);* i7 J& v3 ^8 p; g
}
* J3 w& W2 N0 t1 J9 Q9 Y: h' B }
1 f3 S# b% G. F) u! Z, R5 E6 C
- v8 Z6 B2 I6 R7 H; _; n return;
! g$ R5 O6 t% N1 q}
. X' G6 ?. C7 E. ?: B
( K) T+ ]8 c/ W+ E" O. l$ b& }# n
9 x0 y) ^% V! a' e- q0 v W2 l
5 `4 R# l' g# i: t+ d$ b; l |
|