|
OMAPL138双核通信,现在需要DSP核中的UART0接口。+ O4 f5 x' r- x! `6 ^0 D$ Y4 u. b
我是在DSP初始化这不太明白。# s& {" S8 _2 r! N/ d
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。" u+ B$ k" G( P2 ]" Q6 e9 @
3 U; J9 C# ^, X& [1 i
# Q3 }* i4 c- R" o8 E2 C/ @首先 PSCInit();//UART0使能
9 _& |8 r" n( m: ^; Hvoid PSCInit(void)
! @% L/ I6 M, [# `1 ^, q{& _/ k: {% e2 O0 H! D) b; T8 S
// 对相应外设模块的使能也可以在 BootLoader 中完成
( @9 x2 b, c! R @ // 使能 UART0 模块' \0 {1 g( P- g% _7 }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
8 U& ^: q3 O( E @: G' {}
* {5 \, a) s: q& `( H( G: C. r$ b, ]/ Y2 y$ O. N# Z' |% ^
$ h/ }2 d% C. a8 `- c6 @1 x+ S1 H然后是 双核通信的初始化 AppInit();, D, A. f, A$ V$ J+ L8 q
void AppInit(void)
B8 ]- Y, Z3 t _" g+ F{4 }1 @3 y7 w6 J* ^
/* Structure to initialize IPC (see Ipc.h for definitions) */
5 V5 v# {- Q1 j1 @; R$ u) y struct IPC_cfg ipcCfg = {
3 W6 |/ U+ x% r' } IPC_DSP0, /* local processor Id */8 i; C( U1 `9 B) h2 c
IPC_ARM_HOST, /* remote processor Id */
. Z+ r& c5 c. g4 q7 v' d; N9 @" I IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */3 J+ _# x/ q i5 Z' o5 {# i5 X* Y
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
5 u t7 h& e! L NUM_MAX_EVENT, /* maximum number of events to be created */
' f2 w5 }! ^. w0 E1 Z' k' ^; c &ipcPvMemDsp, /* local side private IPC memory */
+ M( S0 D9 q& y$ O1 V8 C9 M0 z &ipcPvMemArm /* remote side private IPC memory */
$ A, Z& _* e7 e9 F$ J" [/ ?! b( _. c };) I& @2 [4 P7 F# H8 Q
IntDSPINTCInit();3 }+ r8 H6 X$ T6 r* [
IPC_init(&ipcCfg);
+ Y# i8 I. E4 S$ @7 r. D IPC_intRegister(C674X_MASK_INT5);
( j! o" |' C$ X3 ?# V; ` iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
5 u F7 g; `: U* c. |
; K" Q+ @2 d3 M3 @( N" k& E /* Enabling interrupts for DSP C674x CPU */3 ^% n9 |- a" C! z V
IntGlobalEnable(); /* Enable C674x global interrupt */! ]0 Z% O5 r7 q$ B
iAssert (Notify_start()); /* This will enable IPC interrupt */! X" K) {, A6 x; K/ i j! D
}" y7 B. v" T) U, |1 _
' @2 a; A5 y E; E9 u然后是
8 q% f5 Y2 l% h. ]" _7 v$ L // UART 初始化3 S2 W9 r$ Q/ A; D8 c! H
UARTInit();
) }, i3 j: D: F& q
: `# b% a9 }9 _ // UART 中断初始化
% V6 K) p# M" Q UARTInterruptInit();% y* A7 E& z" u8 [4 [0 S8 B) D ^
; W8 V6 G6 t! @& \2 t
" j' ?5 g3 ~+ c' evoid UARTInit(void)
; _# K. f: h. \& ~: \* ^{
! D6 R3 p' T9 v4 h // 配置 UART0 参数
y6 E1 C& n6 O/ s9 G$ p/ [ // 波特率 115200 数据位 8 停止位 1 无校验位
6 V" R, i2 b: j- s# y: R* f9 u UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
0 z8 ]: o; S' ]/ j: n UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! p8 I* C# T }4 T( o+ L) B
// 使能 UART0
& P& L6 W5 i3 F# K UARTEnable(SOC_UART_0_REGS);! `7 f' I" S' e% J% g. u
) X2 Q) `. @7 [# M% n
// 使能接收 / 发送 FIFO
2 g9 ?1 Z, o$ |! {6 u4 |// UARTFIFOEnable(SOC_UART_0_REGS);+ t- D7 I @8 p. S) @
; e+ ?1 e& T* G
UARTFIFODisable(SOC_UART_0_REGS);
0 g% n" b2 K8 G, Q& ]* @+ u
9 e* w" x8 [- G // 设置 FIFO 级别 接收FIFO的级别$ x3 Q! F) f U' o2 m
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);. k. N/ f0 M9 S7 H9 n" I
}
9 K+ z) n, W0 D5 W: R
' R5 l9 M; N/ N
" N4 ^+ P3 ~1 R7 C/ o/ [void UARTInterruptInit(void), O: h: K5 b7 j( ~' [1 Y' Y: Z
{, q/ x3 q8 C! m) e/ f$ x
IntRegister(C674X_MASK_INT4, UARTIsr);/ N& V5 E# D! i/ r
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
7 c5 [2 N; a$ ]6 r" A- o2 l* m IntEnable(C674X_MASK_INT4);3 {4 R. h; d" v' N* j5 b- y; Q
3 U$ j/ z- D- N$ H X; p, O // 使能中断
3 g: h: l# ~$ ^; g# a2 ?+ `( q unsigned int intFlags = 0;6 e+ D: O. c ?8 n
intFlags |= (UART_INT_LINE_STAT | \
& Z7 q2 C3 k j UART_INT_TX_EMPTY | \
& g0 \; L+ @& j' Z, \ UART_INT_RXDATA_CTI);
i k4 [9 ~5 t8 r2 }" Z UARTIntEnable(SOC_UART_0_REGS, intFlags);9 B/ g, o7 p2 T- b( u
}+ z9 j7 V% C) g7 j* {# Q
, C# M6 L- N: @: K, V
! |+ ]" b1 R% t" Y. ~" g7 Avoid UARTIsr(). b/ ~- o. X2 W+ H, G
{
; O4 L% C4 i' F1 r6 g static unsigned int length = sizeof(txArray);
/ i* e1 C9 H( s; [. ]( w static unsigned int count = 0;1 ~5 F" z' A- B R! ^" i; A6 H
unsigned int int_id = 0;
: ?" P }2 [; N: e0 J8 m. l) Q4 H/ O( D% j2 o t! w
% B- ^1 J+ F/ z! O& J
4 \4 g6 G0 a4 X, s( F8 O. X // 确定中断源
' _6 u2 H$ ?" ~* S2 h int_id = UARTIntStatus(SOC_UART_0_REGS);) W+ j, Z; u( V
- t1 y# U& f# f/ n+ u. ~- j$ ~3 f
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
) G( E4 e& G' v6 E8 k
/ ~+ z2 K W: F7 F0 ^8 k! X8 ~- N4 F9 T! |- u; O
// 清除 UART2 系统中断- V, t% e* }) _9 t5 j
IntEventClear(SYS_INT_UART0_INT);6 l& `5 P6 z( k: \/ _
0 w q2 o0 @" B% M, `" N" a // 发送中断
! b- F" ~) A7 @' ? if(UART_INTID_TX_EMPTY == int_id)
, m6 `& `# M7 y {
; b0 W& ~* D- t, _0 ?( U if(0 < length)( M. g2 V, T2 U" V2 ]7 z
{
; |3 W3 f. I+ M5 D/ k // 写一个字节到 THR
5 d, n* u: N( {9 @ UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
( o5 v1 b& c4 \ length--;/ [7 e N. p& I
count++;
: B( v8 R! u" D+ F; w( d, l7 H6 N }4 e9 v5 _1 p# y6 {
if(0 == length)
' p T, {8 n$ A* m {
0 V& m$ Z; P: F4 \- k // 禁用发送中断$ U) \" [3 [ h4 W4 k# o
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);+ p- ]- w0 v/ ]" \+ r$ ]1 }
}
8 U8 {; l5 ^# S }
+ n4 w* h) H$ P/ K
2 k4 i9 s6 q4 I7 r! P // 接收中断
% o0 W5 R' Q' ]( l" t- C if(UART_INTID_RX_DATA == int_id)3 X( T0 u. N# D. b5 @
{
, [2 l3 j, H2 S( k if(status_a0==0)
3 I( N% Z& H) O3 p# d+ W0 \$ q- b/ y& h/ V {
4 M! U5 s2 T4 q a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! p8 g E) x4 i+ l q4 U
if(a[0]=='#')
+ i4 O% T; l8 V; k8 y {& S0 c; r& b1 K/ {& a
status_a0=0x01;
% `5 d1 z0 v. y status_a1=0x01;7 L: {: M4 V7 W( U; s9 F) s
}; e3 p: ]2 F! ^+ v
}" N3 F* k9 k% J% V6 V2 Y2 B
if(status_a1==0x01)
" { ?8 L! @( x0 R t {
7 Z6 b0 z! p; N5 ^ a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);( |) v9 _# K2 E( Q3 [! C R
if(a[1]=='R')
: `% n# {$ e" g0 ^ {7 O% @. Q9 \/ X. t; U
status_a1=0;% [4 M$ o; f7 x
status_a2=0x01;9 r. ]" F4 ^% Z: ?; u+ k
}
: {- Q' D8 c4 o, l3 R) e' Q }
( s4 H- T( i4 Q5 G8 b/ r9 }- F if(status_a2==0x01)
* Y' z" ?9 }5 [8 i$ o7 y {
3 v3 S. z3 V1 _/ i( {; ]- q a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" ?- {- n, Z w9 R
if(a[2]=='A')# y8 o+ y7 ` S( F8 L! j& T
{7 h& F) e- l. J. @" Y
status_a2=0;
. a K$ w& H5 F status_a3=0x01;
, {/ W( |( h# s# H' i }; A% A, J: m8 Y/ j2 ^
}
& ?& h* M% E! u) S if(status_a3==0x01)
( v/ \ C7 ~$ V6 v" Y: @" c8 h {9 m4 N9 Q/ B2 I8 Y) _$ d
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);. |, t( K& t) Q8 A. M' B
if(a[3]=='N')
0 m+ O* y4 J% y% g% X {. H9 Q+ @1 s/ x
status_a3=0;
( Y; o9 p- D g$ `/ E4 x4 i status_a4=0x01;
! B( P# m2 w/ V! _2 G. y }
5 P5 W7 H+ g- L' T3 o5 e" H, N }
, l) f9 |7 w X U if(status_a4==0x01)& B0 v; K5 r$ R4 v, Y
{
4 c# _3 _; ?' N: ? a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" l! b; {* |) X
if(a[4]=='G')
! S% L) c/ l1 F7 v% {; G% n {
0 O0 F' T$ B4 p$ x* k/ e5 M status_a4=0;# V" V( f' J9 ~) R- o
status_a5=0x01;# t7 H4 {9 @ [, y
}# W: k* q \ h' k3 [$ \
}
5 E- ]+ u9 S: \ if(status_a5==0x01)
7 s7 p/ H, x/ A5 ]5 Z8 I2 Q" t {, x% b& n& v# ?/ L& Q
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 K c, _! d; h
if(a[5]=='E')
G: C, T; ]! c% a9 i {' T. [$ Q0 I* D
status_a5=0;
8 p% x* W* b0 t status_OK=0x01;
( O; m, y p: T7 M- p5 L }+ J! ]4 k A/ J. y
}
: v1 {4 n2 ]4 E* k8 Z& w9 q6 h if(status_OK==0x01)+ u. a1 y7 e0 h
{
' T; ^5 _; ]/ l. W5 P rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. `5 \3 N2 R) ~( H0 o) i( _; c lengthrx++;
7 s' D, }% Z0 A if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)2 v% S) \/ t6 F+ n$ z$ r0 \6 Z
{
6 b" S6 c' s$ |5 P3 R RecState=0x01;
1 _/ W' G, t: G0 e1 A e* D: S. | }
U2 f* I6 ?* a }/ F/ [! G4 O5 |
; S, k9 S6 [0 b7 \
}
" D0 W3 M* T9 r8 d7 A9 r+ w2 n
9 R) h' V- k, z* F& b' v // 接收错误5 j2 B+ `( B% `! z4 l- {1 F, |3 j
if(UART_INTID_RX_LINE_STAT == int_id)
5 b3 X u* V+ {3 ^2 V& y3 G( g8 I {
3 a/ o& h, c1 @$ M while(UARTRxErrorGet(SOC_UART_0_REGS))' j; \2 R3 z( e# ?4 V" S1 O, ^9 |% L( W
{, |. Q# y u A9 z/ z( k1 F
// 从 RBR 读一个字节6 }+ J7 }5 ~+ F. h' s. r! m
UARTCharGetNonBlocking(SOC_UART_0_REGS);: z; M. E, E& C
}
" h7 L$ z# l d7 w7 m: d6 g }
" V+ J- k" h4 R( {( L- l
, p+ w" T# v' o8 S% G5 c return;
& Q( _3 F6 H) P# b* q}8 _9 S" d% K2 ]6 `& }2 z
3 W2 [4 I$ d5 J9 M
. r! X B, e; Z2 K1 f
' c0 m" ^' F/ \: [ |
|