|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。
9 S0 _, C9 N0 i9 S3 N- T我是在DSP初始化这不太明白。
3 l0 V& f6 S. h6 B5 _" q2 }初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。/ X" I; p1 Z, A1 A1 r
9 p) }: b. k$ A/ H
! `( K# U/ z% L首先 PSCInit();//UART0使能
; X- L/ E" p2 s8 y7 w3 K# g/ Mvoid PSCInit(void), y) v( I% @* L1 @2 {& B0 m
{1 |' r: y' N4 N8 F
// 对相应外设模块的使能也可以在 BootLoader 中完成
- P$ C# s9 o. j* A! J // 使能 UART0 模块: s5 e1 c8 i) U/ R! s. _
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
% Z; N2 `3 j" H& M. |6 a) i! I) X}: R1 C U/ i7 s% H( a% W
# `8 w2 e& Y! g- T3 r5 [
/ V% }& M1 K8 Q$ s) ?8 B然后是 双核通信的初始化 AppInit();& l& k8 C- ]. S. H( a: z
void AppInit(void)
1 }% R2 B d9 S) i% t6 t{( m: n( V; k8 ~# x9 S1 i
/* Structure to initialize IPC (see Ipc.h for definitions) */
4 C, Q W+ d% I! @# } struct IPC_cfg ipcCfg = {
5 }: N" l& S- l& N! U6 y( N# I IPC_DSP0, /* local processor Id */
4 f5 w: x) U1 P IPC_ARM_HOST, /* remote processor Id */
& e6 @. _0 Z- z' n* i IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */7 V0 i0 V/ ^# p4 S6 y2 X3 P
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
+ b1 z) l- P7 b NUM_MAX_EVENT, /* maximum number of events to be created */3 _5 A+ X# \7 Q# z
&ipcPvMemDsp, /* local side private IPC memory */% e3 C2 j* I3 x; i# S
&ipcPvMemArm /* remote side private IPC memory */
3 A2 h4 J5 @/ q9 T) X. G };
* h/ ?$ ~# U5 a/ h* V IntDSPINTCInit();; A4 y6 Z$ V4 i ?: j
IPC_init(&ipcCfg);, N9 V* x) t; Q* Z- C; I( X# S
IPC_intRegister(C674X_MASK_INT5);. H9 Z6 z5 i* ^5 B
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));' `7 z8 j/ ]; ]' m. M2 Z8 K
% j( {( \, z7 R7 Y7 v' S: J
/* Enabling interrupts for DSP C674x CPU */* T N7 I$ ?- R, }" W' z
IntGlobalEnable(); /* Enable C674x global interrupt */+ O4 C9 w8 n- T3 `, q, r) x
iAssert (Notify_start()); /* This will enable IPC interrupt */- x5 B) M* a6 W# N' D' g
}+ F3 d3 c8 B( N- F: R: x
) Y" a$ e* U+ u0 J4 U/ }& b然后是 8 |8 _5 ?+ P, E
// UART 初始化0 a6 M/ H4 v# ]9 ]$ l6 y
UARTInit();& c- B% ]* Z' ?# G7 f& R- C; s
* Q& m# O7 O! L- o
// UART 中断初始化
0 V2 X4 |. |) i5 J& _8 o. V# Q UARTInterruptInit();$ D, h) |0 c j( }
. a) I; B, T: @9 ]
' Z; [! k3 x2 \/ b0 a6 P: f2 Ivoid UARTInit(void)7 a% _0 i9 s& c9 ?6 _
{8 Q! a: y" ~0 P& l3 [% E8 e
// 配置 UART0 参数 p" H) s6 {+ m2 V5 O) {
// 波特率 115200 数据位 8 停止位 1 无校验位# i! G& q6 o/ l! U+ Z% P
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,9 n$ L& l8 s2 l: s% X1 O8 v8 Y
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 G- M2 C4 J0 I& |1 Z/ W# h4 @# L
// 使能 UART0
- \* s2 W% D( p& }- t; x0 [8 E# D UARTEnable(SOC_UART_0_REGS);, V1 D% l& u. Q# m5 X6 Y7 K a, X4 }# ^
7 m' z; i$ @! W$ \
// 使能接收 / 发送 FIFO+ P4 K( f4 N/ \' J
// UARTFIFOEnable(SOC_UART_0_REGS);* F4 b- N* q( I' K' r+ b' q1 \
h( T1 J4 v, n4 F+ s( g
UARTFIFODisable(SOC_UART_0_REGS);8 J$ {, h4 `0 d* ]
7 }4 V9 C9 U5 F7 P // 设置 FIFO 级别 接收FIFO的级别5 m% F, r, @# i1 c! K0 I* z
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
0 P* i; u. T% C+ f4 |0 r# w( f}2 v0 U( P5 S% q
- R! C. y$ @8 m5 L( ]; s3 ^1 {" X( Y, v; W
void UARTInterruptInit(void)
" e2 a7 F# z( n! o{
+ T. R) z6 D4 L: Q IntRegister(C674X_MASK_INT4, UARTIsr);
$ S5 `# ]& E7 ]- Q3 z: Q j IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);. y+ f0 \3 k! i- O" ~
IntEnable(C674X_MASK_INT4);; \! {" K9 D0 T W/ U! s
5 h% H" R# }# x' u // 使能中断7 B) c \0 J+ `( z
unsigned int intFlags = 0;- N. X( J$ _# I7 u2 p) P# M
intFlags |= (UART_INT_LINE_STAT | \ l8 `' }1 [3 z* H
UART_INT_TX_EMPTY | \" x1 i# {9 P; ~
UART_INT_RXDATA_CTI);- d } a0 H, ^- J8 W: s+ r
UARTIntEnable(SOC_UART_0_REGS, intFlags);
' C% k3 b2 Y5 s$ ]! r}9 P# ?' C$ j. d3 d, V
. [/ r, d. u, s# `0 k
- \$ S( ]% `+ ~3 M. H* W2 `! Rvoid UARTIsr()
3 S3 Y" B# G. G{
2 H2 |# D4 r( [ static unsigned int length = sizeof(txArray);6 a* ~9 O6 x2 @% h b4 s1 Y
static unsigned int count = 0;
9 V+ o$ K9 h! S1 I unsigned int int_id = 0;. U+ K0 n' q* }8 P$ n; B R+ W
$ v+ R6 X( x, s7 z9 N* p$ @
7 U- x( ]& j S: l4 P# A
+ U/ t- D( w% Q) J3 Z- l% E% S // 确定中断源2 b. w5 S+ y( X3 x+ p: x
int_id = UARTIntStatus(SOC_UART_0_REGS);
' \( q0 }! C Q7 E$ a- p
2 [5 g' }3 F3 \# W" k // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
, K4 S1 k" J* v9 R7 V2 s; I: A3 H8 I' c3 L* S
% o: N* }6 F% D7 ~
// 清除 UART2 系统中断: _' w, O$ i2 p
IntEventClear(SYS_INT_UART0_INT);
" c6 x. Q$ n: k+ S* \, z5 U2 b/ q% G4 o4 m
// 发送中断9 U; z f1 f# @; s4 y# r
if(UART_INTID_TX_EMPTY == int_id)5 o" ^' L$ Q2 F
{
c/ `+ Z3 K8 G! }/ E if(0 < length)" n) R: [ q5 `0 m
{
, k8 ~* x b* ^9 D' h6 g // 写一个字节到 THR
! X( M' L2 |$ ?3 G: K) e UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);! d% c0 w9 \' v0 h( ]
length--;
9 H# n- i3 w$ S% `3 ^ count++;
/ m$ `, L: \4 c }4 n$ a s* P5 V) h. A3 B4 Q
if(0 == length)! E6 W3 n0 e. e, D' b3 M
{
4 \2 @8 v! N0 Y- p. h3 J // 禁用发送中断; f5 D- m0 L6 u6 z" K" a6 J
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
h7 y& G3 Q$ T: u4 J' d, ?9 d% A }
) J' S" C% e% n+ d& F1 a# E }
1 j, F: C, f% e' b1 W7 s! j. N0 c* S8 Y& a, p7 ~3 r
// 接收中断$ P% Z/ e$ {# s8 X! Q
if(UART_INTID_RX_DATA == int_id)- |% h% @8 m" b6 q
{
7 _1 Z0 w5 N" h! \ if(status_a0==0)
1 a* \ q u# i" ]( K {
* _ d l& v# a$ J" o2 X# p2 ] a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# N6 L$ V# e% ~/ R6 Q3 y
if(a[0]=='#')
. D$ |+ D( P# v7 B {
4 q, t# s/ v8 `# D5 j' r status_a0=0x01;! g5 U3 ^5 w2 B6 q# I
status_a1=0x01;
* x3 l3 g2 Z9 c! y3 t }4 e A4 @% u, a# ^- u8 w
}
. [+ A* g0 R% I1 \$ U if(status_a1==0x01)
. |0 g& P+ t3 z% v: U& ] {
/ m& R( ?) X1 X7 \5 w a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);+ e5 I1 u* M, s. n! x
if(a[1]=='R')
; A" j% V6 l0 S7 O {
; X, B! ?2 i) X% \/ g status_a1=0;# k! }% @& j2 m+ d: K" P
status_a2=0x01;
* R" T7 g+ M/ u) m5 i5 u }
6 p) E! u- S3 J4 { }
, `3 ~) Y% ^; N3 H1 f4 Z if(status_a2==0x01)
1 y$ I( f5 a0 e' ] H; p" B# J {
- p$ r1 ?) K- v8 F6 b( r a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
# p& A) w4 l' \7 b if(a[2]=='A')
7 y/ m. k! a, s6 S9 U {
" Q9 I) Y% W) \- H* | G; O status_a2=0;
9 u! w6 ~& {( i status_a3=0x01;: T4 q7 c- [) l- C. @+ y+ t
}% R+ P. i. _8 \8 K/ g
}: H0 k! b p; @- q
if(status_a3==0x01)
: N' Q6 C1 ~3 g3 b {8 ]; R) z8 Q3 M2 j5 n: B; a
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
/ ]1 r. g4 T4 N% ~' B if(a[3]=='N')
2 Y3 D8 i9 c6 }0 E$ |) ~0 t& D# r {
. _" f: n1 M- W7 a status_a3=0;. C0 Q6 q' N) J: n, K6 a0 c
status_a4=0x01;/ G6 ~$ b( Y8 L& ^) Q0 [; F
}2 m, B8 j. \. |* a- y5 q' A; `% w
}
/ @! z- Z7 |4 }8 X, N if(status_a4==0x01)% t J+ W# N, c- I9 z( X n: c* u
{
5 e# ~" x9 w( {8 l a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
* t; `0 T, K- b if(a[4]=='G')2 B3 i: V' p& ]) g
{
4 ~( o: _- o3 v. y status_a4=0;' r+ f% g1 v. I, f& F- f
status_a5=0x01;
2 @3 x S; g: v+ i2 q }$ `/ N* J' j/ h$ i) ^: |. u
}0 m. {* T+ t' N+ ^) `' k
if(status_a5==0x01)
$ x. ^& U* t: o4 M/ P8 o {* t- O9 R H* y5 t$ y6 [' U
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# }! k3 d0 w: h& b
if(a[5]=='E'), A/ @7 S! o$ ?9 p) l2 K
{1 ]$ q3 d( ?$ ]% z
status_a5=0;
* c, a% ~5 k1 O9 [8 W* D" w/ l2 m status_OK=0x01;
: Y6 N- ^4 z- V1 h* @) n, f) W }# i* n; H, L# X/ Z6 [
}- M ?* S4 z5 `% S
if(status_OK==0x01)
" `1 g+ H' p, N: l( |! I {' F( ~" e+ F" @+ i" y
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" \1 |' E9 d4 R# i- S
lengthrx++;
' I/ h! c; ^; D2 N if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
6 J$ N u/ m9 [. x0 D) F; {: Y: A {
% M( g* n7 X1 h' v5 a+ a" @ RecState=0x01;
5 ], R$ E- W' t; p! y6 B: [5 v }
V. e( l6 b4 ^7 J1 H' N }; b( I' c6 o, n& d2 g
8 k$ R; [: _% v8 L }0 g; P. w( E1 Q, ]/ P6 |
7 |0 L2 b0 c4 @, X( {
// 接收错误% O% _* S3 T2 Y8 L6 ?" I$ [3 I
if(UART_INTID_RX_LINE_STAT == int_id)
; s8 F" C; X" B; i C {5 H/ ?' i; ^, H" N, t. y
while(UARTRxErrorGet(SOC_UART_0_REGS))
6 {+ Z3 d4 {+ V1 s& B- Z$ Q {5 Z( ~+ \8 ?0 N b3 ^
// 从 RBR 读一个字节# s% ?0 y4 M* t' {& \ M' Z0 n% U
UARTCharGetNonBlocking(SOC_UART_0_REGS);; u, C, a/ g! a* n+ I8 T" U
}
2 M, ` R5 J: ^! o }
* e+ s/ b6 j; d# r% Q) C- l c0 j* a' x" M5 n, _8 A/ U k, @
return;
6 }8 Q9 t7 Z% _, \+ ~- [! g}
+ f6 U$ e/ e. T2 i9 f
& g8 A7 q& H% k
1 C) R7 H# e% H r( T$ o% Y' A2 Z' q* Z m) \
|
|