|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。: ?7 _- g9 L% ?7 u N
我是在DSP初始化这不太明白。; r( |' [* @0 [+ t1 ^. q, y
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。+ K! F b9 [% ]+ y+ @6 k
. I1 C! b z1 L) t1 g
0 K; y3 {9 l I" F首先 PSCInit();//UART0使能/ c% l1 z1 B j8 `/ C( X
void PSCInit(void)
, ~ k0 u8 ]; A6 T1 f- D1 ?{0 ?8 j) d$ R9 r& U5 g: g+ O6 Q
// 对相应外设模块的使能也可以在 BootLoader 中完成' I+ @4 ^- ]* F: C; r
// 使能 UART0 模块& l8 l, R7 z" V- r2 R/ N9 a# H& E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);' N8 K6 j3 @6 E: s- y( \
}
/ T! B/ p6 Y) a; `; D: w. [1 O5 r$ p% |5 U5 E3 ~: o' S5 V% v6 Z
2 P3 z& o* J( n6 r然后是 双核通信的初始化 AppInit();/ ^* g8 I# o ^7 W. `; [8 R3 c
void AppInit(void)! k7 b+ r, a4 s* m9 @# I
{( ^1 |1 A; k# @1 o
/* Structure to initialize IPC (see Ipc.h for definitions) */8 l; ]; I6 f& O: D8 r) a; K$ ^
struct IPC_cfg ipcCfg = {( F( |. n" e, I- i
IPC_DSP0, /* local processor Id */( j7 f- ]- r n
IPC_ARM_HOST, /* remote processor Id */" w6 f. `! A, d' j
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */
2 {5 d& r4 N$ y L+ \ IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
! S6 B" P" P- t8 M NUM_MAX_EVENT, /* maximum number of events to be created */
8 E; A4 e0 Y5 h% h9 \$ e &ipcPvMemDsp, /* local side private IPC memory */$ c2 m+ J% g9 f7 M: y
&ipcPvMemArm /* remote side private IPC memory */! c9 i- w! q G/ r
};
2 h8 P" g5 V0 X) I) J IntDSPINTCInit();7 P/ \& _" \" P" W! o
IPC_init(&ipcCfg); J2 l8 X9 X5 H4 {" _
IPC_intRegister(C674X_MASK_INT5);
8 r5 e6 m" P. I, e$ v iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
$ a3 M! ~% `3 J x( ?3 z- t; P5 P
~ v: D$ q% `0 z: B. u" Z /* Enabling interrupts for DSP C674x CPU */, r: u: Z! _2 f, |2 Z
IntGlobalEnable(); /* Enable C674x global interrupt */
( y/ x+ ^- }! B9 p iAssert (Notify_start()); /* This will enable IPC interrupt */
5 Y1 _2 `' x. g9 _* W% ~0 F}
4 h7 W1 r i; z) O$ }# T, d* r. O) O
然后是 - P, b8 k( j5 O* T
// UART 初始化
' a! s+ D+ U5 j. k0 ?4 Y: U8 w# U UARTInit();; O6 x3 w# O) m `7 F
. C/ Y$ t }/ _/ _1 P* c. [
// UART 中断初始化
0 K% e H7 n1 a$ T! @ UARTInterruptInit();: w9 ?" v, i' }1 L9 _
0 h5 L- B" K, P; l" C" t3 ~/ D4 l4 @. t6 H+ X
void UARTInit(void)
" N+ R/ ]. J+ a{
! x8 t9 J/ ~, I S5 N6 x9 K* C. z // 配置 UART0 参数
+ F+ z5 g+ z# ^) X, U8 k% X* g // 波特率 115200 数据位 8 停止位 1 无校验位0 X, l. `. B5 f* ^: n
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,4 J( a/ k2 ?& \0 _
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 b5 ]. Q$ y' @* G/ N$ @# ]; C
// 使能 UART08 I7 f6 ?+ [9 W4 j9 g0 j
UARTEnable(SOC_UART_0_REGS);
5 T1 K; \- Y' V( G: p5 }
1 m4 ?, j% R4 a# h, Q% K5 U5 s2 Z // 使能接收 / 发送 FIFO
$ w# \! j! l* i$ s. w) y- ~$ l7 c// UARTFIFOEnable(SOC_UART_0_REGS);
' I; _: N1 j2 D, M
: U; b- L* u: I: M1 F) T( B UARTFIFODisable(SOC_UART_0_REGS);+ l; x; @9 Y6 S. r
! f4 u$ l" ~4 F. W2 a% J
// 设置 FIFO 级别 接收FIFO的级别1 I8 C- Q) n9 ~1 R/ f9 R& m8 T; S
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);" U1 K8 M6 Y( J0 c) z1 _
}
! j: g0 v9 o3 u. S% ?
* |. b! ?$ K7 _4 p# H2 f8 o' k
' L' `4 q# d$ V! @void UARTInterruptInit(void)
. F6 y$ L) M: ], A' h1 G9 G0 X{ y. T! G$ e: ]( F
IntRegister(C674X_MASK_INT4, UARTIsr);- u8 X* K6 t3 M u2 u0 \
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
1 G& j4 Z8 G# h( G) A% o6 N IntEnable(C674X_MASK_INT4);% O5 o( A0 U$ j8 \; L0 G2 Y
8 P8 f/ r9 X5 S% K* L
// 使能中断
1 h* r9 \" K. W1 B/ g7 S+ w" [ unsigned int intFlags = 0;7 s' V' Y% r' j: N. d% `( o2 Z
intFlags |= (UART_INT_LINE_STAT | \
, \* R4 x# M0 ]% ^9 S0 @4 e( m UART_INT_TX_EMPTY | \6 P1 z: V' v7 `. @: \( z" `
UART_INT_RXDATA_CTI);. O! K7 Z. B8 {( s5 o) b [7 R
UARTIntEnable(SOC_UART_0_REGS, intFlags);& o1 T" V, N. D# P7 V \" g) C
}$ h, j8 a$ y% |$ k& x5 P& P
5 B+ A3 M$ |* L, ]
* E- _& T3 Z2 U, Y2 w( L9 l/ b
void UARTIsr()( N5 C* _& h; S4 w
{5 k' G1 U2 F1 {( }2 Z
static unsigned int length = sizeof(txArray);6 b. O V8 V$ X% }
static unsigned int count = 0;+ v% U. m, W* H7 W% H: A) ^7 a L) i
unsigned int int_id = 0;. ~; G- R- ]) Z) v/ k/ a; z
z- R4 G! l. \4 @; c2 e1 u
! @8 h5 b J, D. t0 x; Y4 U! J5 Y+ I
% I5 p7 _/ M7 k: R$ O // 确定中断源
( h! i2 f4 ]( t. V4 x _ int_id = UARTIntStatus(SOC_UART_0_REGS);
9 l9 j3 q% a" w: k2 q4 r% U9 U8 o- `$ v6 u
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
1 Y6 g# s) ?8 ]2 S
; m, @6 R* R) N0 r# G5 r% p K% ^9 y D% [" X
// 清除 UART2 系统中断
. u# }+ \6 o& X3 u IntEventClear(SYS_INT_UART0_INT);3 }" T; p, P; }7 E* _, R. {
% ]7 Z9 r% I( ]+ M/ t2 P // 发送中断
: v3 G4 p# I a7 Y4 x if(UART_INTID_TX_EMPTY == int_id)+ @9 c8 y/ M9 u8 y" ~
{0 F7 _* q1 u3 Q1 Z! X2 i
if(0 < length)
/ u$ B, s7 R6 a& K: B$ u {# O- Y) n2 k' i$ `3 g& C7 x E9 s
// 写一个字节到 THR( Y/ z3 s0 S+ v' n
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
7 M* n \6 |. P2 f, K length--;- t& ~. H' }+ {
count++;. B1 j. l0 `, d) d* |
}; ^( Z+ I* X( D' L0 @6 g# Q, x
if(0 == length)) k% S, A3 w7 T4 @5 [2 R3 T
{: m( c' L2 { n# w) V7 O0 b, \
// 禁用发送中断
+ V v7 p: c, J9 r, P UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
6 ~8 `' C5 L# ^6 f( }3 k% C7 q }4 x8 U1 x& Q2 k7 |1 f" K/ c, P
}& T3 A1 N% p% Z) Z6 s+ m
8 S' _5 q$ f, b# c4 p8 r
// 接收中断) b$ A6 M; h, ]( U O N: M M
if(UART_INTID_RX_DATA == int_id)
8 ^" n+ L3 i: q: ]. \* u# J+ y {* s& ^" P h$ Y3 U5 p7 Y
if(status_a0==0)
; ~2 ?8 k/ n( r {
! S( H/ i. Q* E% u N8 N. M+ Q) w a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
: `0 f3 n* V2 M7 q, Q( k( ^' t if(a[0]=='#')
, H7 G4 S" j/ a {
, h# W. b0 l; ]; o status_a0=0x01;! m0 d0 c$ a3 G3 _" z1 ^
status_a1=0x01;
% ?- H& _( f. b' Z1 _3 K }* ?2 i" s. f$ y7 T0 g6 x! P P
}4 ?6 t, U5 n: e& n+ K
if(status_a1==0x01)
+ S$ Q. g& H* W* p% }4 M {
" r9 u$ |0 y N a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ d# Y6 Q1 f( W, k
if(a[1]=='R')# l$ {5 E; C! r' h2 a" L" n
{
& T' _* ^# L% D I status_a1=0;1 {3 j0 f% R' U; Q! V
status_a2=0x01;
8 M9 j g& Y2 A9 t2 }. L }
' S2 M' i+ {" m3 d3 r% e }
2 F8 Q$ c3 P# U) ?# l, B0 R& F if(status_a2==0x01)* P9 \' n1 Z5 k( g! w6 u* M
{
8 M; R0 J0 Z/ P/ | a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);; U8 Y' X0 l) J) Z: @. t9 [
if(a[2]=='A')9 D1 C+ W& W- H7 f
{
/ `- y( `3 `5 t9 S- E status_a2=0;5 G6 H9 B, W- d0 _
status_a3=0x01;& X t7 i) z' s
}) K) P3 C( f4 T6 \4 ^) L! `$ z
}( @$ ^% Z* K, _. k
if(status_a3==0x01)6 Z. ]# M1 r1 S& }9 M. N
{
) K. Z* R9 j7 T a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);0 n1 h$ i8 h; ?0 Z5 t' r P
if(a[3]=='N')6 s. ]- x! ^6 D9 m3 [) v
{
/ _2 \+ f& k$ F/ Q# a0 u' {: { status_a3=0;9 p( w& K- G* w# N1 e2 d c Q' k
status_a4=0x01;8 J9 X2 M# G1 ^' V* e; B
}5 K1 n) s7 s9 w6 {7 N; s+ s( T
}
; j& i* l7 a) S+ v if(status_a4==0x01)/ p4 _& d( c! _& [ X
{5 p( x4 W3 b. `8 J# ~5 v: d
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
G$ Y6 E6 L- H) U if(a[4]=='G')7 S$ L1 j# N; H5 C
{
$ \4 d" q) S a. p3 \ status_a4=0;
$ V2 T5 b+ Y4 H$ ] status_a5=0x01;
" I# x+ j6 o+ H& |' `5 X }+ C/ z: V1 e+ x
}0 M. d% P$ G1 C6 |! S) L( f
if(status_a5==0x01)
% v& z5 f6 z+ V9 l {
% z ]. |! O \9 k+ ?- D a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
0 F" n& M; W& P% H8 i if(a[5]=='E')
9 T- @# p: Y5 E# J {% v& t* o2 P9 N
status_a5=0;8 C; o' t- d- d3 t5 E1 L
status_OK=0x01;; w; a: Z. ~4 o
}
6 z9 A& {7 `5 ~! O% c# _! F }5 o: R6 q' F6 b, G1 ^7 {1 U4 j* @( H
if(status_OK==0x01)
3 a+ G! l* i! I8 U/ R1 \ {: q6 f( u9 W; w$ n, A
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 ^8 C# k6 O: v( h4 T1 g) o# I- ? lengthrx++;
) f6 k% L/ A2 z if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
: _+ _' q1 v7 X7 ~9 Q: i( v% i! h: I {7 l4 K5 ^) P. [8 Y; Q6 Q* `
RecState=0x01;
% ^9 G m& }' L5 C4 ] }+ f4 t5 ` q. s- a7 E h$ U; A
}
. i$ h G) A) b2 z# M8 Y( {9 K7 A& T, O6 Y8 ^) N2 k
}
1 y$ z" h* d& f; V2 a. H8 n" \0 U+ M P* J8 J0 R' V0 [1 v
// 接收错误( h& Y$ ^* t8 h. P% F6 Y7 K0 T
if(UART_INTID_RX_LINE_STAT == int_id)
( L) k, R& h: B6 i- ~ A( q {
/ s6 x) r% [* a$ s$ Z- C, J+ o4 Q while(UARTRxErrorGet(SOC_UART_0_REGS))
" ~4 E: v/ G; \. C {
; v( l' J3 J/ q! Y8 z: D+ o" }3 ~ // 从 RBR 读一个字节+ M- S% @# H5 l+ g. A! [6 T" f' a
UARTCharGetNonBlocking(SOC_UART_0_REGS);- o+ m; H5 u% ~- f7 j
}
! p& b% m- O3 Y }6 `# z3 E; @. P8 Z0 s* J4 y
3 B# D% B" |5 g return;# w- q' i4 _. H @
}" d9 n$ ?$ N3 {, b, l4 t
R. _3 g1 O5 T6 X* K' G
2 X3 Q5 |# N: v: d& s' _( q% O$ v( S8 B/ i
|
|