|
OMAPL138双核通信,现在需要DSP核中的UART0接口。" V; P- E% a& q% k: ~% A- h& N/ l
我是在DSP初始化这不太明白。
; U% _" s4 V# O1 v5 r- u( O初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。6 c: v H4 R+ b5 H
0 a3 C0 h. ^2 b
1 C4 F4 F% ~3 s
首先 PSCInit();//UART0使能
' D- P) U0 z+ j8 Cvoid PSCInit(void). |+ O6 {; k% I( U8 @& s$ ]
{# ^" t# ^. q5 x( W, a0 \3 q2 y
// 对相应外设模块的使能也可以在 BootLoader 中完成: l/ A7 @; Z: a. i3 z
// 使能 UART0 模块
7 l; F/ X) U+ b5 H8 T( G3 q6 b PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);$ E; q; A7 V9 {% n t: E6 ^
}
9 R& l& s. z; C7 Q7 J$ C
, z+ A8 l, S# c
9 s: ~! X7 A3 ?4 c然后是 双核通信的初始化 AppInit();5 s" U+ E7 X# t! t3 S' |
void AppInit(void). ]' Z3 x6 k+ S* p% n% `
{8 q, E5 S* `" w$ Y
/* Structure to initialize IPC (see Ipc.h for definitions) */- Q4 V+ Q' t. I4 {4 y: |
struct IPC_cfg ipcCfg = {5 T& Y0 M. a; z" r- N" T
IPC_DSP0, /* local processor Id */
$ B! P( C# _& L" K3 p IPC_ARM_HOST, /* remote processor Id */2 Z& |3 s) u+ e
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */9 X4 h0 ~7 h2 s! r4 O) l* D
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */9 L6 b+ t$ s9 k0 i+ E) V
NUM_MAX_EVENT, /* maximum number of events to be created */
# K# T$ h% z4 T* B% R2 F# G &ipcPvMemDsp, /* local side private IPC memory */
) j; S& v4 B$ P* W &ipcPvMemArm /* remote side private IPC memory */
+ r* F2 n3 C# N. c& e9 d' l* L };
# o! |, p; f# y8 { IntDSPINTCInit();
. O! r* _3 w w IPC_init(&ipcCfg);
( C: z: X( S3 W& K IPC_intRegister(C674X_MASK_INT5);
; R' L* l; G: E- N4 O0 J0 W" i iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));' R4 M- k" v |" d) _3 p1 C
5 K! k2 P1 _9 s/ z) C
/* Enabling interrupts for DSP C674x CPU */" z0 t0 n% l) X/ @2 Y
IntGlobalEnable(); /* Enable C674x global interrupt */" v$ M6 H n" x5 a; T
iAssert (Notify_start()); /* This will enable IPC interrupt */; a) o2 z8 B$ K) p
}; x. W* ^' x4 Q# K! D$ f+ G' j
0 B2 c; v. U! T$ A. |
然后是 ! {: p2 o# I' m7 M$ G
// UART 初始化
, _ }) j1 V* h UARTInit();
% g2 d* b2 l+ M* P( F
- ~8 S& b p: u+ r# T // UART 中断初始化
" D1 ~/ w+ t; Y6 t/ J UARTInterruptInit();
! v: n T- r# B1 `. m3 Z! ^1 d6 n8 m$ [- I1 o7 L
% T$ r% s$ J. d, S6 M8 z8 Pvoid UARTInit(void)4 l! ^9 F0 Y. v
{3 u8 ]& E8 v* A6 U' I$ f$ D, L3 c$ _
// 配置 UART0 参数
- S: u! m" ~5 }' ? // 波特率 115200 数据位 8 停止位 1 无校验位. f# }4 b. a" v# l. T n# Z6 g5 I
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,, z( B |2 U; z# L5 ?$ ~
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);# ~ V' f1 O* N {0 ~( N
// 使能 UART0
( Y1 E- n! u: \6 h, d UARTEnable(SOC_UART_0_REGS);6 S3 ^* q8 z; {! l- F+ ^9 P/ Q
7 [$ p0 |1 S9 m$ w // 使能接收 / 发送 FIFO
0 w2 F$ x* M) a+ S// UARTFIFOEnable(SOC_UART_0_REGS);
& e. j2 ]" X2 m/ n C( W5 d3 E5 {# v" P
UARTFIFODisable(SOC_UART_0_REGS);) p8 T# K- _/ p; W5 m& D0 ]' K
* e& r% A1 T0 {
// 设置 FIFO 级别 接收FIFO的级别. @" \8 o, b: c; x g1 M5 L+ e7 x2 V
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
9 v, O" c2 a2 D1 V% W}5 Y; L" ]$ A: ~
. n. d" \$ t+ n5 D2 S
2 E- j* v8 U6 Z0 R1 m, f; Q: D. b" M
void UARTInterruptInit(void)
' ^: B9 T5 Q7 [ u( z{ E" [( I& _, [" I
IntRegister(C674X_MASK_INT4, UARTIsr);
) h4 A; @, ?- y# ?) A IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);; ?) r9 a9 b2 G( d2 l2 c
IntEnable(C674X_MASK_INT4);
+ ]6 T3 @ ^" X/ h! |
% Z) F/ a" A1 t6 X, f2 J // 使能中断
6 e4 D4 ?+ u8 o0 }# C unsigned int intFlags = 0;. H/ L0 C. ?7 X( X7 }" K4 }! M
intFlags |= (UART_INT_LINE_STAT | \
5 m1 s! ^" E8 }7 {% i. J3 X! _ UART_INT_TX_EMPTY | \
; C/ W9 X4 M1 I+ g! l UART_INT_RXDATA_CTI);
( n9 K( A2 z7 D7 H* s' q5 Q0 b UARTIntEnable(SOC_UART_0_REGS, intFlags);; H: E, f p* V" N" f: w+ V! B
}% D5 h( i' b6 S
) ~. f$ A; W: ~( s& N, X/ a _% I4 K; a5 l0 G
void UARTIsr()1 R z% f* s# ]
{
& r v# l" o2 p/ {9 z' c! P$ l static unsigned int length = sizeof(txArray);
" ~! \) n7 d; t X4 R) \ static unsigned int count = 0;3 e% g: }! N# L& u- r
unsigned int int_id = 0;: _) y5 e* y, X$ J
$ ^" t/ F W5 p6 w4 O
7 L' T% A( x0 F! ?% ~ Z; x. F
r' ?: A7 @$ e4 G! l# Z! J* ]$ l // 确定中断源# Y4 a7 @0 j7 B9 ^
int_id = UARTIntStatus(SOC_UART_0_REGS);7 J. [' ^: x l% w# E
. }- |; p' V1 {) M0 p
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
4 Z) T/ t6 z. J: r* N
6 i& ?# P0 [& F+ v: a1 e0 D7 k
Y/ A& o8 G7 U, s+ ? // 清除 UART2 系统中断! f; y; U S5 i' E) I& C/ r
IntEventClear(SYS_INT_UART0_INT);: u( ]' o! H0 H
; ]. A9 d( y3 [" R
// 发送中断 W0 V/ W6 R2 c- g
if(UART_INTID_TX_EMPTY == int_id)- E# t; I0 m& O* y6 S. M
{
) }" k1 T% S/ d3 c if(0 < length)
" O6 S0 e/ s2 c! }0 A- e {1 G |# i8 _2 }3 w( p; f
// 写一个字节到 THR. o, n- u5 k- a' H& K9 W% X3 Z
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
" e* e- K) N+ T2 g; Q4 y* g length--;
; ^+ [7 G% Z( [6 n1 ^+ V( R' ^ count++;
+ p+ J% j' d8 F. g. e }+ j7 |, f8 ` A
if(0 == length) }+ n8 w1 ?3 @5 A8 u7 j
{
{" b: i: w4 S$ V' u' q4 q) m- e // 禁用发送中断
( j9 e1 E% ~- y UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
0 U, \% ]: Q. n3 N5 H- u2 Q0 u }
! A; w% W7 U& h( P+ K! K2 {8 k) N }
! _* |3 z+ t; j4 h5 d% d7 R- } [0 i7 a- L( d# ?
// 接收中断! Y3 r* U( X2 e, `0 o% s
if(UART_INTID_RX_DATA == int_id)
- I8 g! q! f" w: Y, y, [ c/ A {
* ]( \7 ^. l6 X1 [ u% F if(status_a0==0)$ G) ^8 P9 O# d6 [
{
; S5 E% N7 A: I+ [2 k a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
. X8 S6 I- s: Q1 N0 \* y( w8 h if(a[0]=='#')
( W& a, i1 \3 s2 Z {6 D- H @5 F1 P0 F9 i1 n5 i/ B
status_a0=0x01;- x: a5 O" ]* ^6 ]! w- Z
status_a1=0x01;
# S* @9 j" Y4 n* A } e# {8 ~( W& J9 Z4 h# J
}& W. S5 g0 x. \* y/ S, g. U
if(status_a1==0x01)
0 m" m2 ^3 l( w$ F/ y {
7 B! y( R8 {; B# i( D a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# S( v5 @/ Q- {( s3 P9 u if(a[1]=='R')- b8 h; M M' @
{6 Y" s: p6 Q2 a/ T0 q
status_a1=0;) j# l0 I: S! `
status_a2=0x01;$ d8 S# q; [, Y) T1 |
}. b' Z; K; A. V% j
}
- z! h- m7 f" ]! F if(status_a2==0x01)' i% S. [5 S: ?; H8 u1 c* N) _
{8 n% |7 G- N# Y6 O: }
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 J4 V4 @, H9 E$ N
if(a[2]=='A')3 `& V4 ^7 M- z# | t% |% h
{
% l* p/ g# A% n' s1 s) g4 g status_a2=0;
; U, J3 X! I- z/ u+ p- @( V- X status_a3=0x01;
# b/ J0 {7 f. N7 c+ B }
+ ~0 E/ y+ E5 U# ?. q; G, U ^) a+ T }) m' S2 c3 h. S! u# H
if(status_a3==0x01)
% d y) h- c3 x: h. n) i# q {
( L8 M M! E& j" ` a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
( Z# X Z' @8 W if(a[3]=='N')6 L- s1 Z0 T8 `5 `, x
{& ]# x K( f K. {) {' d; M& \+ H
status_a3=0;
( n1 y" P" @4 ?& i status_a4=0x01;
1 F h4 |# f# f" o/ N }
3 p/ [8 e* f1 @# [ | }2 g& w$ z) Z3 m1 ` y
if(status_a4==0x01)5 E( d. Z I9 c- t# [/ w
{
/ r7 [4 b" [5 v* i0 z" S0 Y- U; o* I4 Y a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
5 H( ^) R1 Z3 ~7 y( b if(a[4]=='G')
9 P! ~ n/ n1 j! v. I {
4 s3 Z/ ^& H) L5 j I' b status_a4=0;9 A/ _" Z. }* _7 ?6 D2 p) O
status_a5=0x01;9 p% L, z$ o3 L! m( P" S) w! L
}4 Y: O2 a% `6 f$ ?; m* _( S( b. {
}
5 Q/ I6 z6 F5 c6 ~1 r% E if(status_a5==0x01)/ Y) H( s% i) D6 E: k! b0 h5 b: F2 Z
{
4 X2 i7 x4 @0 C. y a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 n! I/ x2 p7 C0 [ if(a[5]=='E')7 E3 Q* t* ]+ W8 v3 x! T% H
{
* y }: d" q1 f, Z4 |* Y status_a5=0;5 l7 [6 Z" @9 H1 T8 y, l! P
status_OK=0x01;
4 ~9 y: t* Z9 i2 n+ u }
' G* T w3 a0 T$ R: I2 ]9 D }% F% X% m" y% \3 I0 J
if(status_OK==0x01)
. f5 N6 t' K) s' f8 d {
+ O! y, u4 T: R: s! f1 D7 U rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);4 c5 r; l d. B5 s
lengthrx++;
- f- R" c- i# W& ~* u' |% r if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)7 X0 m/ j* F$ @- T! Q, M! E
{' | K3 c- k) v" _
RecState=0x01;
w1 v' y/ Z7 Q% U* q% w( s& j3 U }
j! d1 G6 A3 J) g: E& c+ X; K: n. ^ }
- \: t+ D: W1 B7 _8 s3 }
$ q+ x* y4 t6 T- e9 [( O }+ P) B* T3 _# P
- X6 e7 v2 }$ k0 ?/ C3 _4 H9 E# k$ p
// 接收错误
m' f8 m& }" `) [ if(UART_INTID_RX_LINE_STAT == int_id)
" l V: v8 x1 e* [' M) O {0 }7 T7 l. C$ o. S3 W- \. _, E
while(UARTRxErrorGet(SOC_UART_0_REGS))
9 K% @/ ?$ U% p9 B/ ^ {1 n7 J I; _( }( _2 V) B* W
// 从 RBR 读一个字节
5 }2 J. f" b& X+ o1 C$ G P! ~ UARTCharGetNonBlocking(SOC_UART_0_REGS);- X9 I0 Z, s' h, i
}' f1 Y0 G% ~' l5 j* [ O9 C
}
% N4 {* D9 z6 C2 L' W, D% `; D! y8 B, m' N* E
return;
# v* r3 {: y" r6 [}
- a1 f; F3 p) Q( I- ], T" C. E& e6 P$ i! j
' F! u( F, [5 v0 u' `" U
; Y/ b2 k; ~2 G/ r8 b3 S |
|