|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。$ X2 d0 C+ z4 H7 D* G
我是在DSP初始化这不太明白。. Q& {) y9 b1 h) ^) H( ?
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。2 r# l8 v" `( Q/ E
9 u, K. q/ ^ _7 A( j/ @8 Y) \7 {, H- ]: O2 D& @! V" s
首先 PSCInit();//UART0使能1 ~; j/ |" Z3 k$ M
void PSCInit(void)
+ o3 l' ]' p* w! t4 l{5 M1 B& Z4 s3 R, l" X
// 对相应外设模块的使能也可以在 BootLoader 中完成! f$ }2 S0 b; k# J% g, k6 w" Y9 w
// 使能 UART0 模块! r1 z& R) z* Z/ E) ~, l+ n. ]( Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
7 L0 V) U+ F T% ]# V}; r% [+ n5 Y6 J0 | f
' e5 V$ K3 ^% E; A2 K. ^9 q4 D& @* i, [1 n H2 Z
然后是 双核通信的初始化 AppInit();2 M5 z- P. f% `, E+ G
void AppInit(void)
1 n. o6 X9 }4 Y. ^{' z" X5 v- A3 s( J% P
/* Structure to initialize IPC (see Ipc.h for definitions) */+ V% E8 c; C/ |1 F) Y+ i `' t0 d
struct IPC_cfg ipcCfg = {6 y9 t' I S- |0 k7 m! q- e
IPC_DSP0, /* local processor Id */4 U' {5 H" g, K$ s- x' J
IPC_ARM_HOST, /* remote processor Id */8 J( h" z. F! i" ]9 h1 M5 w
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */- ^& s* U5 s$ f- [ d2 f& a3 U" o+ E
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
* v9 B4 F* p0 j% V k NUM_MAX_EVENT, /* maximum number of events to be created */
: l' D, I0 L# o. x4 N; p1 k2 g &ipcPvMemDsp, /* local side private IPC memory */
2 r+ t* b o0 o8 G' O &ipcPvMemArm /* remote side private IPC memory */
# O0 d& A$ g( z9 K' M };
6 |8 C1 g7 V8 B0 O* e IntDSPINTCInit();
, w: N+ K7 ]* z5 x3 ` IPC_init(&ipcCfg);* c% {0 ?5 X9 J r/ y0 H4 m
IPC_intRegister(C674X_MASK_INT5);" _& X7 e6 X3 j1 T h
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de)); ]4 X9 t8 J* o/ [$ {. e( X
8 F+ f, u- e! |6 E1 S2 D2 D* V! H5 ^
/* Enabling interrupts for DSP C674x CPU */
' _5 z6 }& k& R* m# V$ e5 c$ [ IntGlobalEnable(); /* Enable C674x global interrupt */
( r( u7 m, l' p1 ^$ V* t0 p8 Q iAssert (Notify_start()); /* This will enable IPC interrupt */
3 p8 e5 {9 e; e& k9 q}
3 }$ o, y L+ I S1 n$ g3 M0 R1 j" }9 T. e% ?9 }' ^/ g8 P" C2 l# p! W
然后是 G" y2 R9 Q9 Z- o' k) X
// UART 初始化
& d7 V- r+ ^! v# J5 q$ q, B UARTInit();# E' g! d9 [( S
$ L' Q: q& m# z2 Y" F6 b. c
// UART 中断初始化
# P# @ J t) [- `( e UARTInterruptInit();
9 d: {0 h% a$ Z [$ y
$ r( m8 e- N( f' i
/ v9 Y& \* ^1 t5 H; ?* N! [void UARTInit(void)
6 s W8 R5 o5 X, K( T{
& B8 G$ t W; B; q4 k& N // 配置 UART0 参数" z4 f. U# j% M$ z6 @
// 波特率 115200 数据位 8 停止位 1 无校验位# O( a4 c# F/ a/ b8 N1 ^3 m
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,8 y5 y" V9 t2 D9 E
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
1 ?- w0 G# x' O2 Y+ S" h. d // 使能 UART0
6 X! O; T& x& \0 t3 ` UARTEnable(SOC_UART_0_REGS);
' Q1 O- e6 S7 ^; w
+ N$ U3 b/ f3 o4 h: o1 {3 P // 使能接收 / 发送 FIFO, H0 T* x% N0 Q$ M/ q# o5 ~0 H
// UARTFIFOEnable(SOC_UART_0_REGS);
# F) V$ {8 s! a/ |( z9 ~! L
& U Y0 z' `2 M7 G1 X4 } UARTFIFODisable(SOC_UART_0_REGS);
9 C8 [( m2 b0 i4 d% T& @( l6 ]) C; s6 X9 Y
// 设置 FIFO 级别 接收FIFO的级别! x" F! a4 K. s& u$ _
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
( H7 S) u- \; V8 f+ w}3 m% x% n. O9 y5 R/ c
: K6 M3 W j: S( I& b: ~# Z( P9 h# Z& V
void UARTInterruptInit(void)
, s3 D+ @5 C& f1 U- @! @{
% @" M' e4 f: B* g$ K) B IntRegister(C674X_MASK_INT4, UARTIsr);# y1 J3 T# P% y3 p9 C
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
+ C) c) p# N* l4 X5 O0 S IntEnable(C674X_MASK_INT4);2 i' _' h1 B2 |
/ I; z2 n$ [1 h( ~, r% q2 z- \& u4 I
// 使能中断
- B' O: P; F8 D1 S unsigned int intFlags = 0;. l5 @3 j# E3 q6 \4 ~ q
intFlags |= (UART_INT_LINE_STAT | \
4 r( Z3 ?6 |. @7 a- |. {' b UART_INT_TX_EMPTY | \& N7 ?- p d1 u. J& t
UART_INT_RXDATA_CTI);
8 N& U. b) E0 ~* H; C; W( U UARTIntEnable(SOC_UART_0_REGS, intFlags);. V! X+ S+ B* w: ^! w
}9 S2 w" c- u& a. Z: s
$ P. i& _0 m4 ^2 O$ y
4 p( ?) C9 o1 Y G+ N) u1 `void UARTIsr()+ Y) r" B7 H5 U, F# Z
{
) }" e) F1 {4 {( Z. s$ M static unsigned int length = sizeof(txArray);
) v$ i. e! _# R% k* S static unsigned int count = 0;. t* m3 W; c- `# a
unsigned int int_id = 0;
; ~; @7 a" {( n' t5 x3 I1 Z
& M5 A3 [* U& X* }* ` U/ Z/ _/ }1 y$ P8 Z
5 {" U2 n% ]3 e7 h& d
// 确定中断源
) N. t& v5 L# q% i8 m: ` int_id = UARTIntStatus(SOC_UART_0_REGS);7 B+ B9 v2 _/ S3 f G3 s# u
0 m. f( }$ E3 q8 g* w // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。' ?; v2 v7 z8 q7 |' V
* n9 N( J/ `; p% `/ Q0 R& Y9 X
. v9 H. @% R3 e8 {9 p% x) D
// 清除 UART2 系统中断
" T7 [7 D! E; ^, A1 Q IntEventClear(SYS_INT_UART0_INT);# f) W8 T) D4 [# K
% h T# |1 z I
// 发送中断( j! W$ m3 }, Q: Y* u" U! n
if(UART_INTID_TX_EMPTY == int_id)
. A y7 M- g [2 J& {! ^$ h {2 w; C: t! H0 Y
if(0 < length)
- T$ n4 E$ u, A+ U6 @5 V" ^ { m7 R1 E& _7 c6 S- o: v# v
// 写一个字节到 THR3 l1 `4 g3 q" r: ~
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);, t S; X" |* L* p
length--;4 c8 T8 A$ ]1 [: y3 P( k. B
count++;1 R6 x! L6 m6 r* x/ }% d
}
" {* k( z+ @% q, g3 Q if(0 == length)
" |" ]6 h% I- ]4 V" r1 M8 r& ^ {' {" T, B$ u u5 Z& r' _3 c
// 禁用发送中断
5 F2 K, Z3 e+ c- D" z+ n1 x* x UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);6 a8 `, `: n2 O6 w( ?
}1 K/ l% r& w/ Y; o
}
" L! d) C- s! \- f$ L, A3 C$ S$ f# |7 W* T1 N r" I: T6 ^& G: R1 G
// 接收中断
$ {/ y2 m6 }% {) \5 q7 D if(UART_INTID_RX_DATA == int_id). x7 E5 {7 B: \3 V- F4 {0 E' Y
{0 ] Z8 H8 h' G7 K6 y% K+ K8 ]( z
if(status_a0==0)( U7 e$ o7 I9 d& z3 ]
{- G5 n# g! H) R' p$ E8 g
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 m( k+ V/ m! _1 L* Q6 x, Z! P if(a[0]=='#') f; f6 Z9 u: ~/ G3 n2 c# r2 J
{
4 i) g& o' B" z* R status_a0=0x01;
/ d5 U. l0 W2 _6 k9 _ status_a1=0x01;
( x; X7 Z, ]) i+ ? }
$ X/ k- Y) `! s; N }! `, v% U! B; f/ Y8 w
if(status_a1==0x01). Y7 Y' T* D2 v* x2 \
{9 X8 o% Q5 n1 ~& \
a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
6 T% q/ x3 M# X8 w7 \ if(a[1]=='R')
) u4 |1 r: L0 U) [3 W3 g {% T! W1 U# ]. ^- O: w. {
status_a1=0;
! e' m5 k5 w1 d* j- E7 i- n status_a2=0x01;8 k+ ^; t6 Z5 O$ ~) _5 |/ h
}8 K& V$ I' }5 j, R7 T) M" ~4 H$ @
}
0 B V; d2 Y: ?+ e& s$ L { if(status_a2==0x01), I8 v$ W6 ]3 Y4 h5 x$ G* s6 Y
{
9 V1 u/ J9 i8 s' M- C& n2 p a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; E5 B" j6 P1 @6 B0 y+ k if(a[2]=='A')
3 Q. t# A+ p( k9 e# f {' ~2 s7 D: g7 h1 _$ B
status_a2=0;% m: W: Q. T" \" S3 W% j
status_a3=0x01;
* n' m1 w' A# Y- F }% Q2 W% d8 c# R' u2 s5 b$ a
}# x3 }" S& z2 U I! @2 d5 }
if(status_a3==0x01)1 X9 b. B4 w5 l$ I
{) F# F% q* n4 f9 s! R# C
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 J) L5 E9 \( F& l. Y2 o% u if(a[3]=='N')
0 ^( A) C, ?: v X$ m {
# E( @8 b: G3 ] status_a3=0;
& T( y8 K# v! i: T* K: J9 ?$ [- `5 t status_a4=0x01;
, }. n# Z4 P, r, l }
. w( I; [4 a, [ }6 i4 ~7 U L! K0 Q2 A# x
if(status_a4==0x01), E8 F7 e3 o' B
{ \# a6 _# C4 n# p
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 j3 Q; E" A- ^. P
if(a[4]=='G')0 C. B$ J# g: a, b. U
{
4 `: S% H, b) |8 N status_a4=0;
$ G) ~! L. ?0 ^0 b status_a5=0x01;" C$ y8 ^2 P& b7 Q1 ~
}
3 z) {5 l0 [% K9 H- [3 \ }
7 f$ c$ ?! b6 ^1 s# x7 _# d if(status_a5==0x01)/ Y; M8 `* o- _! @3 _& [) n
{
2 t3 L3 h: B, o! D. q9 V7 F a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
* d Q/ w, n2 Z: F; F7 e" ~9 W if(a[5]=='E')
% L' v% C# k* p {
+ b, ?; h( r/ k) `) w6 g status_a5=0;
l- e }1 H, j' { {- t status_OK=0x01;
; x; s# g+ H9 a }
" `/ b6 e$ o) D: x7 J) B$ Q }# D2 E4 t2 a J
if(status_OK==0x01)
* N) H2 ^& v) d7 x8 H5 u {( o% k& [# V, V# q% O+ ], q) p" X
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);' _$ \/ Y; i7 e8 W: c
lengthrx++;9 S1 F/ q8 J9 @$ K3 ^
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
* c- T3 h( q- x! g% y {/ s0 K& G# S& I7 N
RecState=0x01;
% V; G6 ^( D$ T& I- d2 V) y* f }
* f/ g# Z9 F$ A( `( K# @* @# y }
( ]5 u' q1 W4 H: T9 K" m
1 Q4 |, c" ?6 l* x5 m }
- R2 c2 F k( e) d5 @7 }4 l3 `! s
// 接收错误, C, c2 [2 V! x+ e: L
if(UART_INTID_RX_LINE_STAT == int_id)
8 o+ n+ `- ~$ e3 l9 O2 n {
+ w- s9 b4 {6 a: C( O' b, s while(UARTRxErrorGet(SOC_UART_0_REGS)), a; k6 }& B Y9 y" s H
{, x5 ?2 K) e+ f! W% p
// 从 RBR 读一个字节( S7 `& u8 _3 O, ]2 d6 h# c
UARTCharGetNonBlocking(SOC_UART_0_REGS);5 O+ c5 Z0 V. X) i
}
( h5 O4 F% G" z- P* P7 G1 f; | }5 T5 G$ E' e* X
4 e& S+ \) W5 E2 t1 ~3 Y0 T
return;
, k$ ^! w8 H% z S. M/ ~}7 p+ l- i3 ~; a8 u; C6 u
* o9 S3 j* k2 Z) S; T; B5 [; B1 }9 O# A& l8 D' _ u
/ `; \( M2 Q4 Z6 A" I
|
|