|
OMAPL138双核通信,现在需要DSP核中的UART0接口。8 A9 j0 N( O1 v, p* u- B2 j
我是在DSP初始化这不太明白。
0 ]2 F) P: |' d* B初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。0 c+ f: A% @( Q p* X& N
5 h1 |& B1 w0 O9 M" T& i- [( i
# N8 k- Y# r) e" E, @2 e
首先 PSCInit();//UART0使能
+ K+ F$ T2 P9 p! h$ t3 kvoid PSCInit(void)
$ M" L4 p, g/ O/ n4 d1 g# `% T{, ~/ _6 C$ e3 c' {
// 对相应外设模块的使能也可以在 BootLoader 中完成
& \9 B; f' r; e5 L5 k3 l6 O // 使能 UART0 模块 X! _$ w! S& M$ r; L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);( d: }% }0 R( o
}
: d; h- F6 ?6 a( f$ |8 h5 X1 h2 h. y) Z8 |. J" ~6 I4 W
' v, U; h& K7 r/ \0 o# v2 \/ _然后是 双核通信的初始化 AppInit();
$ o6 Q! u8 y7 Avoid AppInit(void)
. ]+ {/ b- s6 p( S- P{% u8 z( o. S& w' w, g. Y6 `
/* Structure to initialize IPC (see Ipc.h for definitions) */
; T6 L, s7 M8 i struct IPC_cfg ipcCfg = {# u9 F. N( O3 T2 G/ S6 w
IPC_DSP0, /* local processor Id */( i2 Y1 O* D x2 o
IPC_ARM_HOST, /* remote processor Id */
# v- b/ y* S3 g8 Z& n/ Y, O. K IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */+ J8 D: T0 `! z
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
8 B, d% j9 r s3 } NUM_MAX_EVENT, /* maximum number of events to be created */
# G4 d6 F, V9 l" z- W' F# ?, y% A' j &ipcPvMemDsp, /* local side private IPC memory */
" _/ F% h/ A: z2 F &ipcPvMemArm /* remote side private IPC memory */
! x! H' @. D1 F% L0 X };- x4 R" [3 S$ G% V
IntDSPINTCInit();- O O- {& g; X; T0 i
IPC_init(&ipcCfg);
8 @& S# f# s7 T9 ^' U' B" | IPC_intRegister(C674X_MASK_INT5);& f# R- p4 x9 j
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
m3 ]( H# M$ S% A% z* g0 V* ]6 f" @2 Q. J
/* Enabling interrupts for DSP C674x CPU */
& s: |( Q7 ^0 Q# b1 [ IntGlobalEnable(); /* Enable C674x global interrupt */& B% _2 ^! n' {: I5 ~# h+ X) w
iAssert (Notify_start()); /* This will enable IPC interrupt */
* O; _& y8 J1 r* w: @+ K* {6 A}" I& s3 u0 p) p9 t
7 K4 o, C T6 Q/ ?然后是 . s! H9 _6 F; X' ?, d; V
// UART 初始化
! ?/ S0 y8 _# R' M. ^ UARTInit(); c) c g% Y& W* E; p. Y/ B/ \7 M$ W
& t! K0 |3 x) } // UART 中断初始化7 L: }* Y4 b9 j: N- q& u8 f
UARTInterruptInit();0 _6 P/ v2 {+ H( o. Q$ Z
" M6 A# H. M2 h6 F; w8 G h6 }1 ]# W% Q: `- m0 J0 m9 g+ I" D
void UARTInit(void)- f9 n1 L: C Q- o8 U9 K. o. x" P
{
$ A# O; ~1 v7 L% p( c! d- ^ // 配置 UART0 参数/ J+ |+ m( v* l$ ^
// 波特率 115200 数据位 8 停止位 1 无校验位- V6 I" R7 b( h% J- _3 B
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
2 b8 W3 r0 a `9 _$ ~% c UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 N( N D( G; B1 i9 u7 k0 @
// 使能 UART0 @6 D2 y, E4 X9 @ ]
UARTEnable(SOC_UART_0_REGS);
( z# R: Y8 P2 M' g
: _% T" u9 ^& n# `- k // 使能接收 / 发送 FIFO
& I7 T( y/ H! r// UARTFIFOEnable(SOC_UART_0_REGS);
8 W' F9 ]( L9 N0 D' Z& m' Z% ?
v) ?; w! x0 q& ] D, u UARTFIFODisable(SOC_UART_0_REGS);* s. W9 U0 [$ l
) f# ~' Q5 m+ f9 c% U6 ?( }5 u6 N4 | // 设置 FIFO 级别 接收FIFO的级别
* Y4 j# B4 j% P3 e3 X! l// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
9 ?& ^* U; s$ ^2 M6 F) U2 k: |}' l( N! m: @5 t, L# f6 |$ w& F
( |& i8 \; M0 v/ D5 z+ V
/ S r: v0 G& @" M8 L2 lvoid UARTInterruptInit(void)
% `, x/ o5 l7 Y" A8 H{
5 k0 Z! _' ] T, k" C5 L IntRegister(C674X_MASK_INT4, UARTIsr);1 F& B6 ^. I% w
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
6 U$ [& F- P! y! R6 |2 O+ u( p' _ IntEnable(C674X_MASK_INT4);- `2 u! @& w2 N5 T9 B
/ f8 `5 x( N$ [ // 使能中断4 C8 N7 ]+ f0 ]" l7 T
unsigned int intFlags = 0;
# Y5 c) O% g( I5 M intFlags |= (UART_INT_LINE_STAT | \
t& ~/ s2 u6 ]5 T UART_INT_TX_EMPTY | \! Q1 E; D7 `( \! c+ W0 Z9 _
UART_INT_RXDATA_CTI);
* l: V x! @ H$ o UARTIntEnable(SOC_UART_0_REGS, intFlags);
: o7 D( `! M Y- N. C/ q2 H1 S2 i& J" y}
8 D2 @' `3 K5 x- L1 D; ^% K$ `
/ A+ c& I0 M& w5 Z7 k4 b, E3 o: k P
void UARTIsr(), U& J* _7 u* i) A% f! z
{
' f# {* m0 Y$ a, j( l0 A4 F static unsigned int length = sizeof(txArray);3 t6 {. |( x0 x0 C7 s9 P
static unsigned int count = 0;- _5 ?: r6 S4 V9 E
unsigned int int_id = 0;8 ]4 a: y: N5 i. a. Z" i
6 n$ {: {4 o$ W/ z3 {4 ?; Y" B. @
: ]9 d `1 l s# ]0 p ~8 U8 S2 `7 W" c* U1 f
// 确定中断源7 F; j1 @3 E, f( P8 k! Z
int_id = UARTIntStatus(SOC_UART_0_REGS);
$ @7 X& Y# `1 u/ \% f g6 N& h$ J
" k; y4 L1 K. e5 M& Y# a* T! V5 x // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。& L: H( N) m0 d4 d2 A
7 i7 b! z4 ^: M P
8 h5 m0 q* n0 q8 U( s
// 清除 UART2 系统中断' w& ^9 g+ G4 @* R5 y7 d+ _% ?
IntEventClear(SYS_INT_UART0_INT);+ P5 h* y1 ?9 W* ]: T) k
# F$ ^. H1 w7 j U' f% O
// 发送中断
$ Z. H5 k+ Z) T if(UART_INTID_TX_EMPTY == int_id)
! l3 e5 J- R3 D. |$ N; z {3 g% X$ w/ ?! R
if(0 < length)
' e. Z& F! ]& ~3 }% P6 P {
* p% G3 u5 a) l# x! J. l' F2 ]" [ // 写一个字节到 THR
& G5 d9 S) q! I. }8 T! w. L UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);: N0 U9 r" x( }- F
length--;; R, c, |3 {5 j9 W; h
count++;2 R( d+ b. ~9 h7 K! @( n. i! ]4 a
}# E) Z1 i6 C7 {6 E, o# K
if(0 == length)
6 R4 t4 ]6 S! D. G {3 k u( u4 o* u+ I9 {( l
// 禁用发送中断
9 ^9 |. ]* _/ R h UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);) L# s2 w( {3 ]3 E- m+ h9 C% \8 J" `
}1 S- j: [' x! m% e0 B/ \
}- V$ P5 G2 O3 a |
& @0 {9 X" F1 W7 s* `/ Z' ?! U9 }
// 接收中断
* c) X/ N, n$ P" b- Z$ d' Z if(UART_INTID_RX_DATA == int_id)
/ q; i+ z- T" f9 n( y! ?1 s, { {! d* @( K3 o7 Y9 X' R c8 n
if(status_a0==0)
3 O; S( V9 w& O x& }& P E {
( |5 [3 M# e1 Q% f7 t9 W" b a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);- `; r+ |" t( [/ b
if(a[0]=='#')
U% o" ?& S% ~/ ~& Q" V {4 k8 @1 C6 P5 N5 ~
status_a0=0x01;
# i2 s; u! `$ a7 A9 |* A$ O, _ D. i status_a1=0x01;
5 \8 I' k" ~1 U }/ F7 B! r2 r! |7 K8 T% ]
}
; D: A* e2 S2 I9 O if(status_a1==0x01)
# z) A% q) c; e* {+ }, q9 I {
2 B; K. s6 C$ ^: j a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);% _2 R3 Q; d7 [
if(a[1]=='R')% P0 X* f' ?9 K, S9 B
{) k' ]0 L2 E2 Q) A
status_a1=0;9 v. |1 [3 u) I- m
status_a2=0x01;
+ T- ~( p3 u G* ?# r }4 I7 {8 e7 m- s
}
0 d- D% |: @: c: S if(status_a2==0x01)& K2 r/ E. Y1 a- n
{
; w& w6 p8 @4 `! }1 W! @! X a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);# \1 T1 ~# o# a. Y; `: N# o9 X( M
if(a[2]=='A')& ?/ [1 X4 [$ g" G
{: c+ H1 D' \0 o+ e- H
status_a2=0;
& p7 R( q/ Z1 o/ g I3 N status_a3=0x01;) Y8 T( C- j4 G0 z
}
7 w( e7 C5 H, A* x, O( O }0 b' U3 f. H9 j0 j8 m
if(status_a3==0x01)6 y0 E7 E& T0 |" h! {
{; L2 N: `: F0 y/ B+ l: r
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
- b: ~& h$ K$ i% k! x if(a[3]=='N')& F |5 Z+ @# D6 }; h
{) z3 i4 J( e: K0 N$ I5 f
status_a3=0;
4 g1 u; H5 L* @. r# r status_a4=0x01;
( e- E/ y/ |1 Y7 ^' q- y2 Q }* \& G8 r, u) U. F7 u
}1 Y! n: E8 N# p' x6 M! j
if(status_a4==0x01)
( K! b1 F" ?- w: C {, Z! D+ {6 E8 V0 Y# Z
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 V6 v$ y- c5 x1 g' N
if(a[4]=='G')6 B/ b3 @" n9 E! [" a' S1 V
{4 M$ l; y. {6 b" n. f
status_a4=0;
- I& ~# P4 u! D/ a4 @9 o& C) N& K6 d status_a5=0x01;
6 U: I5 d5 i( { }
5 h1 {0 m, W/ v' S4 `5 v/ r4 m }8 ^5 y4 ^2 {' ?$ _* m
if(status_a5==0x01)1 ?* c* j& G7 [+ w
{" z0 s2 n8 d+ L7 N% Z" v
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);9 m- q$ N1 N/ Y* W0 z
if(a[5]=='E')
d: U5 ~! }$ c* Z* L; G1 ? {
0 n9 A3 I+ e+ O8 T5 i* D8 }# U2 { status_a5=0;
1 z& x6 F0 \3 X, I; ]5 ~ status_OK=0x01;
( Q% x; q4 t3 W }* b" D' e* C2 M1 O( C" C0 N8 D
}5 L% M* B- M6 L1 E3 C' V
if(status_OK==0x01)
' y+ k/ `: D1 l1 E5 z8 o {: r6 C' l0 g" `0 _3 \( v
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
9 l/ V, Z' S" O4 V! z1 X lengthrx++;, o+ i1 n2 H3 A3 {! u! x
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值): T1 V5 m& `. _- [
{& X( w9 }) i) g4 M! M9 b( ], ^
RecState=0x01;$ `( h! z3 k- r0 z- s" Y) n
}% b! `) k" g7 v7 |& }& \7 P
} h% _; i" ]- q
8 ]8 Y7 v9 o; M4 w6 p% u {# l }* n% C5 P7 S4 \; e+ {
5 B9 | k& z7 E7 {) u0 R1 k/ o
// 接收错误
) _" G: q5 B' H0 r9 ` if(UART_INTID_RX_LINE_STAT == int_id)
# h( a) t( E* E- l0 r: x( @ {6 r( K0 g7 W) A4 u4 Q- @+ ^+ f* Y
while(UARTRxErrorGet(SOC_UART_0_REGS))9 V/ u- \1 A$ ~" N6 f
{( F& D6 |: a+ t- g+ ^
// 从 RBR 读一个字节+ I8 {6 X! `' D
UARTCharGetNonBlocking(SOC_UART_0_REGS);9 N7 n5 G+ a6 ^. D* b' @$ A
}& a" p Y0 R8 H4 j/ E4 X9 Y4 V+ A
}
- W' U" a8 \0 w. J' K) t, y
$ N8 d+ _: Q! V6 ]7 E3 T return;
( Q* u& b% I5 `6 }8 k7 ?; J' H" N4 d}. k# S$ Y) A4 b+ |* N8 f6 Z; I
. v: e4 l3 W Z1 x# o: E
% M/ G( P+ |* s5 T3 P1 G3 o6 ~. u T3 x
|
|