|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
) q2 u5 {& p4 x& c我是在DSP初始化这不太明白。
8 P3 ~- I8 P+ K7 M$ }) K- h初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。( u$ b+ C# ?0 L4 N6 ~
y8 T! ]' e+ G2 _7 _0 s
3 ?3 o8 F/ \5 x4 n首先 PSCInit();//UART0使能% k7 C- d) {& }- G: v) M+ t
void PSCInit(void)- ?/ l) p0 o* ~6 g! B$ ]
{
7 X3 b! D- g N3 H! Y4 Q; P, A% B; | // 对相应外设模块的使能也可以在 BootLoader 中完成5 `2 f) |8 x# d5 \5 G U4 [
// 使能 UART0 模块
/ N7 q) X# _7 P PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
( _9 ?3 V5 z7 ]2 x0 @}
8 m/ y: B5 ]# ^6 i# O% P0 J+ g; D
n( _, W. }4 l: z: Q$ `# J0 @+ u5 \8 C
然后是 双核通信的初始化 AppInit();
5 w1 f6 `% L* n; l: H! @void AppInit(void)
5 x# O+ g! ` }/ s4 s{7 h, j- R5 M" A, y
/* Structure to initialize IPC (see Ipc.h for definitions) */; K/ M c% N$ a, ?0 d8 n
struct IPC_cfg ipcCfg = {
. |* }5 W2 \! P" B+ p+ w IPC_DSP0, /* local processor Id */
! Z2 G1 H5 V1 o1 k' x! | IPC_ARM_HOST, /* remote processor Id */! l k" o1 @8 G5 o! r4 }5 V
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
5 i* M. p7 P, M0 G4 y' Q4 I8 ] IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */- l( ~/ m) K7 A5 Q2 B
NUM_MAX_EVENT, /* maximum number of events to be created */
4 Z2 a% e2 D; q/ i2 r0 z &ipcPvMemDsp, /* local side private IPC memory */6 J1 j/ P9 d# f% W! |0 |
&ipcPvMemArm /* remote side private IPC memory */
- J- a, l! f& X2 V/ ? };
r( z4 e$ g9 h$ M IntDSPINTCInit();
8 O# r8 ]. {0 h/ m' _- ]+ I/ | IPC_init(&ipcCfg);% A8 k5 e+ b3 B' S# H; k
IPC_intRegister(C674X_MASK_INT5);
2 a( X. E' t! ~& k1 ^# M iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));& j5 F, W q$ R. _ R
+ B7 d% e2 }' a( V: Q6 D9 s
/* Enabling interrupts for DSP C674x CPU */0 g, b: ~/ `" \. e
IntGlobalEnable(); /* Enable C674x global interrupt */' n$ W( M. E9 L! L6 t
iAssert (Notify_start()); /* This will enable IPC interrupt */1 e% U: l; T, b! s
}8 p' \% @# [' C; [, h
! v1 P2 o4 u; u5 B. }) F2 u然后是 2 }1 `7 d2 H5 ?) z$ D
// UART 初始化
0 Q/ M9 q1 M% z: f! c) S$ G UARTInit();! [, _+ K; f8 [1 v2 O4 H$ Q' V
0 a- t# h+ s+ K+ Y
// UART 中断初始化
a: V) y- Q0 i, e! @6 r UARTInterruptInit();
1 z; m* S: J6 v6 Q6 R/ }0 Z! | T% o8 i4 x
) m# |* J5 f0 W6 \void UARTInit(void)( H# W7 H4 F8 I7 s3 o4 Q
{7 o9 R) D# J; l0 J$ C
// 配置 UART0 参数7 L4 K8 }0 R6 c% T/ s0 _; Q
// 波特率 115200 数据位 8 停止位 1 无校验位- b) ?! H* Q7 Y. U9 W: j3 g
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,& P6 L, e3 W+ J' U S2 r3 M+ F
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: t6 A& v2 U4 l: C // 使能 UART0! }/ T e* I" m% V
UARTEnable(SOC_UART_0_REGS);
k: }, a" Y z- n( S
# A8 q+ d8 i7 L* l5 P8 g/ @5 L // 使能接收 / 发送 FIFO) c+ h3 g% {$ p2 w
// UARTFIFOEnable(SOC_UART_0_REGS);
$ U1 G& ^1 z# k# k+ i. ?* N
! O" @ |/ k# n1 N9 z UARTFIFODisable(SOC_UART_0_REGS);+ d. M. I& W }: o1 l7 }& K6 @
: r X2 V0 _4 P) U
// 设置 FIFO 级别 接收FIFO的级别
) \; [+ D+ h& v9 _// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);5 g2 f5 L3 {- i3 s, z( Q
}- k5 r4 t7 A3 ]$ q& ~& Q
; F" z6 `5 r, {8 m, l" F6 }/ s" m' U3 [% f
void UARTInterruptInit(void)- m6 k! M2 o3 L1 C
{
1 ` M7 v9 V9 d" G IntRegister(C674X_MASK_INT4, UARTIsr);! c0 D9 z) {% q0 Y2 e
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
! _- |% C( Y. H IntEnable(C674X_MASK_INT4);8 T" g# _' }8 k$ A" b: A3 ~
3 a8 I4 K- p* E8 u/ Y- ~7 i // 使能中断( A$ Y. Q! F% W
unsigned int intFlags = 0;- v; p- K( Y. c1 q3 C
intFlags |= (UART_INT_LINE_STAT | \+ J' K* ? n3 I& ?' c1 J9 m1 e
UART_INT_TX_EMPTY | \
. M G g: t ^& g1 v+ [- v UART_INT_RXDATA_CTI);
+ U& y1 a6 Q7 D. U UARTIntEnable(SOC_UART_0_REGS, intFlags);( v N+ L- V4 c+ ], P
}
: Z0 T7 k8 v9 [6 W) o% X" d5 W6 |* O/ S& Y2 |1 D8 X
. B4 Z, p% e# {6 Q3 gvoid UARTIsr()
% r" y Y, V/ o. {{) C. x ?9 Y4 z4 e0 {# F
static unsigned int length = sizeof(txArray);
/ G. V. u: e" q& Q static unsigned int count = 0;
1 z3 ?: v1 h7 L) M: g1 m; |. H9 m; n unsigned int int_id = 0;
5 U, a! n8 m/ M7 m8 w
V0 ?+ D' i! B# \+ U
4 V* ]! T/ X: |- {' m* _ u' }4 k0 q% }) T0 Z- x
// 确定中断源
0 V1 V6 ^7 c! z" z. o7 ^$ u int_id = UARTIntStatus(SOC_UART_0_REGS);
4 K, n$ y* z# W4 d0 J% y% |0 C% u v& j4 z0 _ i6 E8 ~2 T
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。( ~" H8 Z, a, S$ w) ~7 E
. W6 Z& a3 D: _$ B1 \! j
6 K5 } G& j& n/ C
// 清除 UART2 系统中断, m/ N0 _* b$ d* p" S
IntEventClear(SYS_INT_UART0_INT);
( k, M: }, u; \. Q! |* j0 H# V6 ?* o* F$ N/ I) [; H& m' }
// 发送中断9 L; e. V/ i9 c6 `% g& r6 n) @: q
if(UART_INTID_TX_EMPTY == int_id)- _' _5 ^* S. ~ ?7 s
{
6 T; A; y% H, _( T5 D6 L9 N if(0 < length)
' q! L; l3 G: h: K {
* \* @! U8 S, |* d! |& ]9 L // 写一个字节到 THR. J' c; ?) ?2 F' n2 c
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);8 V8 z) n6 ]9 ~( r0 |, ] D6 f
length--;
i( B. C+ s% G+ X: x# m, N8 G* y7 @" { count++;
4 h n* }( @) K" E& A }3 A: C0 U; J0 G
if(0 == length)
8 v, v7 h6 b: V8 J" I3 { {5 `# v* @' ^3 M4 ~% e5 D" }
// 禁用发送中断: Z1 @4 n0 @7 @# O
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);6 @$ ?, D) _5 ?: R$ Z6 E
} O% ^; e7 I6 c% @3 H- [: I
}
U" j, ], K3 f# n# ?- c$ o5 h! @( r# `! |
// 接收中断
2 `( Z. S+ W6 [# L# ^; F1 L if(UART_INTID_RX_DATA == int_id)
: |6 s" r! l0 z5 o" \/ }7 J {
" ~2 l( L& R, R if(status_a0==0)
" n$ u0 {; L2 }! j6 Z9 a4 g4 Z {/ z( L$ M9 C' B9 P1 [( U& o
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 G& o% Y2 U: ~8 I0 ]0 ^ R6 Q; x" U
if(a[0]=='#')' J& o5 _+ k3 B8 b( m2 N
{# V8 D0 Q* F+ o
status_a0=0x01;
( @2 i; c* T/ F status_a1=0x01;& @% |* s3 [4 H8 ~) w1 `
}; {% k' ]7 c: v. u8 e) M
}" \ Z9 ^. G8 A$ G" f7 y
if(status_a1==0x01)
9 w! B2 t- r. G% p: V4 T {7 S4 \; s. X' r3 q- m' R6 U) @
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 T8 z9 j! n$ Z- N1 {' L- T if(a[1]=='R')* w/ E7 v' J0 k2 v
{
$ E- \. M: S$ M2 ] status_a1=0;
: r( |! ~1 V. _+ E# ~( t1 r% F status_a2=0x01;; K6 Q N1 J5 j( D
}
, c6 i( ?: m4 h) J4 m } n3 V4 z! M: n# B7 [5 G
if(status_a2==0x01)
4 @! b7 e- X' z6 U( h, c {
& b9 i; i- q! Q, T8 E: N, N a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);2 r z% C# p# M; ?, j
if(a[2]=='A')" V) P; i* \* w: Y: \
{
3 T4 \' d3 s* L2 ~' a+ a, B status_a2=0;
( F6 u+ _: K' i2 V4 f$ y status_a3=0x01;
7 o- L6 J N4 v }: n2 j0 z" f" Z# C ?7 X0 J4 X
} g- |* Y* G5 a& y& m) e
if(status_a3==0x01)
. O1 O% p2 [: D {
; b9 Q; y. l% p- H* |, u. X a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
2 n% ?9 ~' |; J if(a[3]=='N')
' A! C& q0 f0 F& l {
1 t/ O4 q8 S! K6 l/ M! b status_a3=0;
0 z7 Q c2 e+ N y, d2 u: v: u+ P status_a4=0x01;
( b3 i9 z* ?: P7 E }
% Z; \; k" Y5 K; z+ Y } e, \0 H& D* e6 X$ Y' A
if(status_a4==0x01)8 ~3 K# Q/ K4 S7 u6 t- ^0 w
{
: c0 w* i/ U( k/ h a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 H5 ~; q% Z2 W if(a[4]=='G')
! G1 |: R/ m. O& ]4 B/ o' G3 i% |5 H {5 L( g. o1 S2 Q) v, X
status_a4=0;5 C) T& K, h8 J6 w% D8 o
status_a5=0x01;, [- t, U( v" Q6 D7 E
}
2 ~, ]% S4 |$ N% u6 P }/ h' L; K' X# B) Y( E8 \& y! |) {
if(status_a5==0x01)4 b' V- z% Z" ]" Y& ]% e
{+ n9 [8 a1 ~7 n: d! h9 O( L: M, b
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, W# W' ^* P# _. A if(a[5]=='E')$ P# W1 w3 L& f7 h9 Y* _
{
8 A5 j6 |* j* Y: n4 j8 @ g5 I status_a5=0;/ |- T4 Q; l- O
status_OK=0x01;
) E9 I7 a+ i, f' P* G8 t }
: s6 C7 M0 f$ h6 o/ ^ }
& l! G% m$ ]& k0 C2 i if(status_OK==0x01)
0 y/ Q! y+ _% U0 }- z {& _" X! j: S& c8 u9 Z6 ]& y
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 m$ ]' b9 u9 Q& }7 q
lengthrx++;
' f* H' O8 X: O, N: o6 Z if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)& R L0 U) \) e# _) e
{# ^) b! ^, }2 M% D) b
RecState=0x01;
7 q) k) H$ l3 Z; z; h R }
6 S# A( d' s! y; h }( v# I4 V2 g- y7 a
d2 a0 v A$ {2 A2 K- {
}
3 J4 G3 p7 y7 Y+ i4 c' H# ^; K }0 k: M+ c* Q7 `0 W
// 接收错误
; C% E8 t: T8 Y& k2 k+ D if(UART_INTID_RX_LINE_STAT == int_id)
3 z4 z5 A( V2 d' @ {
% v6 `& g! N2 G, |$ ` while(UARTRxErrorGet(SOC_UART_0_REGS))
" K* [ o4 l' D6 I% o Y {
n7 ?& \4 I j& ]' m // 从 RBR 读一个字节
. M. D+ q) F9 ^2 `9 f/ B# X UARTCharGetNonBlocking(SOC_UART_0_REGS);) L2 Y$ ?* v9 I$ k9 m* q
}
$ Z: I% Z9 }$ L" F }% Y4 Z! p; D+ z6 ]$ W* ~3 |8 A/ ]
* v' B! O/ h9 ~
return;
0 R0 h# Y/ y1 h0 p1 E$ e3 ^$ ~# k}1 ~0 u3 j1 C: g/ J! {2 b
. B1 T6 P' w" L2 a; g1 X1 ^. Z. E& I1 ^* ?
^7 |4 ?( ~( I4 w3 {9 j |
|