|
OMAPL138双核通信,现在需要DSP核中的UART0接口。8 z/ _0 B" c) S; Q% [# q
我是在DSP初始化这不太明白。- ]9 e, u- \8 F' j6 w2 m
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
3 Q# m! h7 X% Z1 g6 S
) K! H6 p, k( I o
" {8 m9 s- I4 I" X首先 PSCInit();//UART0使能# ?: }5 M' i% T; ^& O$ P$ `
void PSCInit(void)
! F/ ^( w4 n H1 c& K% e3 w1 _* U{+ P A! c; q" A$ v. u% f
// 对相应外设模块的使能也可以在 BootLoader 中完成, S3 {3 q, K0 A) Z% i5 r* S `
// 使能 UART0 模块" R' C" D! L/ p: r9 m9 y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
# J5 o4 ]% j4 k}0 Q6 A2 A0 S2 M# \+ S" H
& l& @3 t5 a/ ?4 W+ H; F! \+ |% ]. l3 {" r \ E
然后是 双核通信的初始化 AppInit();
" R5 n% l) q: R9 C7 Tvoid AppInit(void)
$ u$ G6 P9 p/ i# n2 A( d7 Y{* L1 J2 h* S6 Q: s1 b& ]
/* Structure to initialize IPC (see Ipc.h for definitions) */
" D7 r8 c6 G$ N- @. s struct IPC_cfg ipcCfg = {
. v# j- S" {1 f% s8 A0 q IPC_DSP0, /* local processor Id */
! R. n, I I Z& [ IPC_ARM_HOST, /* remote processor Id */
5 Q3 P6 V) [* k IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
1 ]) W6 K2 l" ~! _ IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
# K* X: e5 \8 u, J& ~+ O A NUM_MAX_EVENT, /* maximum number of events to be created */
1 `6 d5 y5 R" h9 r" e/ J! |; D &ipcPvMemDsp, /* local side private IPC memory */
+ C( z& Q7 s( F1 U &ipcPvMemArm /* remote side private IPC memory */
5 P' W# u$ w; P* o) H$ h };
( q. a( Q9 |) \9 q- E IntDSPINTCInit();1 V% ~" y' `1 G( e* j o3 {0 g
IPC_init(&ipcCfg);
5 a6 o, P) E( k, X# s' [7 ]% D IPC_intRegister(C674X_MASK_INT5);1 w4 F0 t3 f% H1 P: B3 ^" `% n
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));$ u) s F8 e0 R0 m( Y
9 k4 P5 V, b' F; O- P' k! G1 i
/* Enabling interrupts for DSP C674x CPU */) P% E, k2 J- g
IntGlobalEnable(); /* Enable C674x global interrupt */
% C5 b9 g) n! e& `" w- y iAssert (Notify_start()); /* This will enable IPC interrupt */' M/ Z7 E0 I* B$ r) y+ q/ a4 ?7 v
}7 g" x6 q1 G' t' Y3 c& s; v! E6 j6 Q
% U2 e, W5 ~+ m( e- Y8 q- c `+ C然后是
$ L% C( \9 x! o* j3 m! K. B // UART 初始化) L% w+ m9 W! p" o) f
UARTInit();
+ x' F7 ~) ]$ W. x" A- C; c# K5 P5 d& L8 L; |/ L' k
// UART 中断初始化
) D& y/ i' E% f6 |/ V$ @! L: R1 A UARTInterruptInit();2 r$ J1 J7 l# e# ^/ y3 Q8 o8 ~
6 `3 j2 \! |! \0 c3 K* o3 s- P) E/ X/ I& b& ]5 Z
void UARTInit(void)7 |7 ^/ {8 f; d2 V2 u6 S$ o
{
, J9 G! i/ e) ?: f* T // 配置 UART0 参数
; k, P: \* B2 s9 H p Z( I // 波特率 115200 数据位 8 停止位 1 无校验位+ k% X( t5 W8 g ?2 t6 \
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,$ }1 Y. ?. c' X3 @) t9 t3 J
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
4 K( Z) b4 v( b8 `. t1 u1 X // 使能 UART09 u6 U( D, A3 G; h3 X% k
UARTEnable(SOC_UART_0_REGS);4 K0 i' |# N9 w( j7 c
. O9 r" }# m8 R7 v) h0 V5 T // 使能接收 / 发送 FIFO
% _% W; P6 u. [: o! H// UARTFIFOEnable(SOC_UART_0_REGS);( A2 V% K! z' F' C1 M9 X
{+ ~ o* x/ y! m+ X/ k UARTFIFODisable(SOC_UART_0_REGS);
* G. @4 V+ A) H4 I' u9 ]3 m9 L+ |8 z* T0 U$ E. m& u
// 设置 FIFO 级别 接收FIFO的级别
3 G4 H! k- z5 v6 f# l// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
5 L8 T" g6 t; I6 W( B" `* r2 v}4 F5 u5 u/ p( F3 ?: w& H3 B h9 `1 S
. V5 K' a0 q7 N+ g
c# h1 g% m; h/ {. Rvoid UARTInterruptInit(void)- n: ^1 L9 `. T
{
2 Y7 P0 P6 S2 _% A! k IntRegister(C674X_MASK_INT4, UARTIsr);
9 d1 K# q- o$ J2 J" @ IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);- P4 `. a/ ~6 G' p
IntEnable(C674X_MASK_INT4);
& q* N& J& \, J' g
, \. d4 Z/ b5 T/ I* N2 R // 使能中断+ C* X- k/ z3 h& k- q
unsigned int intFlags = 0;5 D2 d1 ?2 O" P) j
intFlags |= (UART_INT_LINE_STAT | \
+ _5 c/ |5 E4 R$ q Z UART_INT_TX_EMPTY | \ r o T6 O( b! {8 h9 U
UART_INT_RXDATA_CTI);
. v1 v" O( _2 h, i _. T( o# T UARTIntEnable(SOC_UART_0_REGS, intFlags);) U$ M& r7 d V. B( s3 F" C# s! f
}
% w5 F! E3 o7 F% b% s: B8 v9 {3 U }' l3 \) Q/ e" R5 x
: N% I* g% \% R" {8 V9 A+ {void UARTIsr(); o8 U! S( p; z# B, R& O
{
2 o) a) V1 {+ y1 R static unsigned int length = sizeof(txArray);; o, D/ f1 l0 [; |: ^5 ?2 v6 w
static unsigned int count = 0;
+ k( e8 ]: c) F. } unsigned int int_id = 0;
5 g. R5 T! g' O3 m# j
, u" w; l D% w$ a& O4 p' O4 U- c$ u/ p% P
1 V, I8 m( h" W5 I2 S
// 确定中断源+ Q$ Y$ T0 W3 v2 O+ i" G4 S5 C+ v5 u
int_id = UARTIntStatus(SOC_UART_0_REGS);
. \" u- e# N& f$ e
/ c# M1 f, I+ a% t // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
+ @6 X# p% w9 Q8 M/ S& @2 p
/ m* p9 f' w7 |7 n" U
2 z3 |2 o$ g" v, D$ p; k1 Y // 清除 UART2 系统中断
# U' ?) ]; p9 ] IntEventClear(SYS_INT_UART0_INT);
- r4 ^: V& l. u
0 f" j) S+ g$ y6 y: P5 F // 发送中断" Y! J6 g6 l0 M/ K
if(UART_INTID_TX_EMPTY == int_id)
. B+ ~7 p9 G3 G' I {6 w! q6 T" L5 w- ?4 G2 }
if(0 < length)- P) w+ Q! i8 @' [/ s- z
{
+ {2 v3 W. B' M% [6 P5 ? // 写一个字节到 THR4 M3 n b+ f, f% \ v( g
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
/ j/ M' g7 i3 m% H0 ]( ]) w length--;# o1 K0 ^5 Z- P/ e$ l4 O
count++;
! Z7 u! I+ ?, ]9 {' S }7 d& x+ y: N% }' @, }+ ]: R
if(0 == length)9 `! p4 X% G$ q( v
{9 Z* c2 ?2 Z& A2 _2 u
// 禁用发送中断" y3 T, ^1 L$ ?. c
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
3 b8 Z# O; h3 ~ @- I" y }
% H+ i! [7 w( {% s. \' O8 R }
6 {/ }" d+ z7 @5 @, U% ]
7 v: _% l8 f+ j" f; }) C // 接收中断
) E% Q X! B, }4 U f- D if(UART_INTID_RX_DATA == int_id)
9 H t( [ D! z& N# v8 {" | {
6 n: _+ W+ |0 V& q3 G$ A6 r/ v& } if(status_a0==0)# l, [6 B L! _7 p6 \ R
{
7 O. L5 V" T6 j/ P8 d! ^9 z a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, P/ T w2 E) m; v- } if(a[0]=='#')
, W W/ ?1 B4 q {
8 x$ y! N5 l) J; ` status_a0=0x01;8 J6 h9 `1 {) d+ d' s, U; v
status_a1=0x01;" ^4 [) b6 `" Q2 C7 d
} D6 L, Z2 E7 Q6 }8 W/ i5 }3 s
}) }4 @$ |8 ^" X. l1 _7 Z5 I, S
if(status_a1==0x01)# E2 ~: h" j3 R7 n9 F. Q& W
{
4 k3 C( {5 b- `' `4 ~ a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' U* m1 ~8 `$ y
if(a[1]=='R')
5 x; L, t+ A" ]9 W# d {% Y, g6 w& F3 _
status_a1=0;
$ T" `4 k" F* ~) _ status_a2=0x01;
6 S% a8 f! ~! P6 X$ h% C }
# A: [$ T' b3 a6 m: v" [ }; ]5 h5 n& J# ]/ ^" ^
if(status_a2==0x01)
% B9 H" Q% E0 Y0 K" e) n6 n {+ R m5 p" O1 Q6 j& M2 V
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 ^9 G5 k H- V/ h if(a[2]=='A')
% t5 j9 r1 E# N8 h' D1 y {: H* X! x( }+ k8 ` r/ `
status_a2=0;
2 N1 \, a6 }" x7 }3 a: Q/ O5 N status_a3=0x01;
J1 q( b+ D& i' Z% G) f* \ }
+ Q" a( T7 P" r; e }- ]7 k) q' N ~( j
if(status_a3==0x01)
" C: \) R. e6 V) h1 d, _8 d {
: T* H6 L* W9 d9 V a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# _! H- K% l0 e- y# M
if(a[3]=='N')7 E' n' v/ y) t% S- n2 f
{' c! {* P+ B" ?. s6 [: \) y9 E5 e
status_a3=0;/ [* s% n4 p& F
status_a4=0x01;
9 ~$ [5 ]" K% Z+ H8 H }9 q) J% N* N. w& e8 W1 G
}. b, v6 u1 ~0 }" b2 g; J4 k
if(status_a4==0x01)* w* x- x# E- h! e
{
0 X/ {' S1 D8 `: h$ M/ R a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 [, o) q5 y! i1 K h if(a[4]=='G')
- u, N% ~$ k& [ {9 Q1 L" U. r% h8 z+ y* Y
status_a4=0;
~. t; c, \% R( s; X status_a5=0x01;
! W9 I3 {; ^: z9 s& G( D j }
! s/ t+ N. i u3 H7 A }- \% x; m P8 G, A
if(status_a5==0x01)( y& X n; j1 Q4 d4 Z, j2 E7 u/ l% J
{
. y- _: A! a* m8 [- K a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
9 a1 `5 n3 Z6 Y if(a[5]=='E')5 p, z# `; V- L
{9 ]; x) c8 R( _/ u( z- J9 C) Y
status_a5=0;- r/ c* _% _" U; B
status_OK=0x01;
5 n7 z2 s: _- E/ W4 r9 K9 W }
n5 ]0 F6 f* [' v: k! B9 G* i P% a }
4 D5 [* i4 d/ U1 z if(status_OK==0x01)
Z. R* K8 \) u! Z- n7 S {
' M& M2 I0 X/ e1 z: `7 R& n. C: y rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' E( d/ o; N0 k9 d
lengthrx++;
; S# e$ t8 T' ^# k if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
- s3 y% X# W" s6 Q. T {
' V3 I" q* U4 o+ y& ^" J( ~ RecState=0x01;
" T/ s/ B8 M) G% C M* { }2 u( c( r' E7 @2 n* ^8 }9 n: h0 M
}
8 ^7 @, s, C, d+ u/ t m6 i" m/ e5 {) Y* U" l4 b3 T
}) ~6 s, i/ ^( Z/ i5 @
( Z; q- t1 z" C
// 接收错误$ A7 o* V. g1 s% D! r4 s s F
if(UART_INTID_RX_LINE_STAT == int_id)/ N5 Q, e' T/ w4 X% \# u* G
{/ s, L! `; j3 s0 m1 a% V) w
while(UARTRxErrorGet(SOC_UART_0_REGS))
4 Z7 d3 R' N2 y* o {
3 x; M# ]2 p0 c, a // 从 RBR 读一个字节; @7 |% @% f0 R- F
UARTCharGetNonBlocking(SOC_UART_0_REGS);
' C* o0 g0 f3 l }
+ c) X& t6 [ e# Y }* ?/ C9 o- H' O# B l6 y: a7 {
5 M3 F5 H; c- E
return;
3 Y! r$ Z' q/ `0 Y3 S" A}
B0 T$ v% F% @7 c# ^2 K2 c0 u" a3 M7 A3 T% n) i$ s
3 b5 A% K- N) o3 M
: {- _ P5 e5 s. b0 \ |
|