|
OMAPL138双核通信,现在需要DSP核中的UART0接口。 O) T1 g0 o% v: V
我是在DSP初始化这不太明白。5 F5 [: }0 P5 [0 V- G" R" `& P1 O
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。
3 {% p* J. j. L6 c: @' \
* |4 E0 J8 O2 j5 N" {
& `- m: S8 ?" o$ w: G: u首先 PSCInit();//UART0使能8 u- {0 Y- z& B/ ?+ w, `# S
void PSCInit(void)
, M! ]/ H3 {% K' a W{
) z+ p l; S5 }7 f: b7 e' q // 对相应外设模块的使能也可以在 BootLoader 中完成 u7 P) f0 Z* m
// 使能 UART0 模块6 k# W9 j+ h4 H6 Q0 f
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE); `3 J3 F5 L1 p/ R; l
}2 V* @8 l, k/ k& G! A; A( @1 \
: v7 \: Q1 q; ?6 h' I# a; q7 H
5 ~* x% O# v( [9 h4 r# n然后是 双核通信的初始化 AppInit();
+ x) n' Z& Q2 W' Q8 i4 ovoid AppInit(void)
7 P; c/ O4 @0 h R' |: c{
) t1 E7 F; X" @1 ]7 C /* Structure to initialize IPC (see Ipc.h for definitions) */
6 x) b: w1 ]0 b+ _8 j7 z struct IPC_cfg ipcCfg = {
4 L; w1 n# s4 z7 K IPC_DSP0, /* local processor Id */
$ e% |5 n+ ~3 R2 W& f! [0 B) k$ C IPC_ARM_HOST, /* remote processor Id */3 A1 q/ @5 ^5 p% K) k5 U
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */) d& k T- f( w, w2 v: n2 Q& n+ }+ ]
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
. j; l2 f( R& c# Q NUM_MAX_EVENT, /* maximum number of events to be created */
! z" _" Y/ ?6 N2 w &ipcPvMemDsp, /* local side private IPC memory *// k; u# p8 F6 F4 e' ]+ |6 d
&ipcPvMemArm /* remote side private IPC memory *// v. ^5 d7 h: i
};
, P1 W, k( P+ c Z( O6 p" x7 ] IntDSPINTCInit();. I" D C J* [6 O
IPC_init(&ipcCfg);
( Z6 B( h8 l+ Q4 Q* [ IPC_intRegister(C674X_MASK_INT5);
+ M _ B, v3 g( Z' j y% _ iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
0 m3 x: L; c" d% I: \8 e
5 E+ ]* y) M K" m2 W( ] /* Enabling interrupts for DSP C674x CPU */4 k! F! f+ h. ~: d8 v
IntGlobalEnable(); /* Enable C674x global interrupt */# T0 W w3 E" o* w0 a
iAssert (Notify_start()); /* This will enable IPC interrupt */3 b1 |2 M' c; W3 K L1 E
}3 z, G& y9 B. g
: L' x! S: c y0 k4 }7 Q6 y2 j然后是 ! u0 b8 n& v6 m6 i7 l1 ?
// UART 初始化( c# M, {1 ^+ |( K) h- _1 j
UARTInit();- E6 Y! c5 H8 c! z' x$ g
! l9 v( g e" F0 H! k0 |
// UART 中断初始化2 G* l: |+ k+ U
UARTInterruptInit();
1 W2 c7 \: f5 A$ g* Z9 o+ j% m. s/ _" I) f3 @& H) C& Q7 @
+ ?1 W2 k F+ K& H7 A% v/ F
void UARTInit(void)+ I4 z, e4 f$ H9 |) |; m
{6 E0 l. z/ |! W- z; c
// 配置 UART0 参数
0 I6 b+ F) l; x2 t // 波特率 115200 数据位 8 停止位 1 无校验位
9 x) q" C1 E) r3 d UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,$ w0 w4 f# k' @
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 U$ t4 m" M8 z) @% I
// 使能 UART05 I2 K+ n# B; E, E4 X- x
UARTEnable(SOC_UART_0_REGS);
1 N: t" p, l6 W! c, j8 q6 L! x
$ ^3 u8 z, H' \ // 使能接收 / 发送 FIFO
# B5 _+ L/ P) `. Z ~& @8 q// UARTFIFOEnable(SOC_UART_0_REGS);
$ v a8 z# E* |2 J3 N ?% R( V4 O1 d2 E' i* G: g
UARTFIFODisable(SOC_UART_0_REGS);) k' q9 F4 j5 N: }0 p: ~% I; T' l
3 X. d: j# @6 T+ v$ S0 T // 设置 FIFO 级别 接收FIFO的级别3 ]8 f" d, H$ Y
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);
3 G3 D( U! |8 }0 {: k/ L7 B}- D( x+ U E/ ]8 c4 R2 h
+ r S+ ^9 h! }# R5 `* J
9 A G) X% d6 T$ bvoid UARTInterruptInit(void)
+ `# |$ w% K" W) e* `/ D5 _{* d( f4 [5 n. ~0 F4 Q. I$ w6 }
IntRegister(C674X_MASK_INT4, UARTIsr);; B! G( K! r0 ^
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);
! i d, `8 z, A2 @1 F; j, i+ n: z IntEnable(C674X_MASK_INT4);
' V" V- v0 ?8 ]- k$ y
: ~. D Y0 F8 ^& K // 使能中断
3 J$ o/ P: z& P$ r4 V: X unsigned int intFlags = 0;
1 [! d/ U$ z2 z intFlags |= (UART_INT_LINE_STAT | \
t$ s+ a0 X4 z# @ UART_INT_TX_EMPTY | \
( y: N6 k6 D) T4 A3 g* C UART_INT_RXDATA_CTI);9 m. X: w3 b& M2 x. \4 [
UARTIntEnable(SOC_UART_0_REGS, intFlags);" p2 c$ H+ K0 z9 {7 J. R7 S
}3 v" u' Y' c* |3 x. ~2 w
" [/ p8 P+ V0 o# _" V6 ^
/ i* x; f/ D6 e. b" v" |9 w uvoid UARTIsr()5 d- g" K; f3 M1 e
{
; v0 z9 k& o! h" l5 P5 o static unsigned int length = sizeof(txArray);8 o2 D4 k3 a( w
static unsigned int count = 0;; |. z) i# Q: {
unsigned int int_id = 0;
3 q+ H4 R3 }1 V( {- c& R \* v# o" B$ a# C, T
: q, J) v& ^2 \) _, |0 M
$ T5 U" s& v- S" {& j* }5 C! }6 u3 L
// 确定中断源
- A# `( V6 ~4 l2 E9 O int_id = UARTIntStatus(SOC_UART_0_REGS);* r1 ^4 H: E+ `8 ^8 h, e8 X
2 Q2 ]& n+ B7 b4 E // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
4 Z Y, V3 h2 \/ V
3 K; q1 d/ I8 u: @1 I0 z8 @$ f$ V8 n, N9 _3 k
// 清除 UART2 系统中断' v& `( r3 E- t
IntEventClear(SYS_INT_UART0_INT);/ N# ~% l" r3 X* n/ p: f: w- A7 ~
: q( K4 f5 I$ b- m# V; w
// 发送中断7 ^7 e* ?: K+ a9 c/ E1 z" j4 ]
if(UART_INTID_TX_EMPTY == int_id)& ~- p/ {: T" ^3 D9 u
{; f8 G2 k( n g, e; L
if(0 < length)( ~/ {% C2 }. r5 `
{
2 n. t3 G" V8 Z% F // 写一个字节到 THR
6 w, \) d2 t* I8 R UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);0 `. W% D! h1 e+ j( U5 B2 L+ T
length--;: O- _6 u! U; L
count++;! ~( X6 L2 t$ b% x; k$ h$ V& \
}( L0 b) ?0 g3 f9 _; s( m; t
if(0 == length)* i) o6 k' e0 V! _4 t
{2 J) F5 y- [# R( Y2 P7 b+ m$ q
// 禁用发送中断) R- H7 m) j e% }
UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
: c) q4 `! B- b! D9 @2 I I }
& |. \2 |" x% C( j }. d$ R B9 p3 }5 g
) N# h1 B9 P8 z
// 接收中断
, U$ d1 m$ J# u+ f! W) m0 H0 O. v9 _0 M if(UART_INTID_RX_DATA == int_id)# ] z9 ~2 J5 ]+ o! E: f7 b
{5 U! L! T5 U+ [5 V
if(status_a0==0)
J" O+ n+ H8 L0 E2 H4 h {/ O8 l: I; W+ Y- P% c; S$ ?
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);* S8 A! \* X _1 ^3 e# t, K X) |
if(a[0]=='#')( \0 F% a* y; k5 P5 u
{
% e! j B& ?4 r. ~' D status_a0=0x01;! ^$ g) E& Q4 T* f9 |9 Q, a
status_a1=0x01;
5 ^# Q- C" A! a/ R. P; J+ A% L0 o }# a9 ]% H( ^9 g0 `
}1 `! I V V! { z% \7 ~
if(status_a1==0x01)
3 T% g- k0 j1 a! P {
. o ~; A" @" o4 c6 ^4 Z m9 r a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);1 P4 i W* c$ \( Y
if(a[1]=='R')
+ }3 d U c3 c6 r3 \& w {' Z. r' w% B" }) {, E( V# O$ t
status_a1=0;1 h7 F$ ~3 k8 s# T# C) ~: r; t
status_a2=0x01;( |5 T6 k N/ s* O( K5 J
}4 |0 T5 U+ v5 w0 |% f
}
$ N8 F) v, v* e: |$ n; g if(status_a2==0x01)
g+ N. D6 e$ N" X' B. d5 G/ E {. Q6 m2 I9 z) _* h6 g2 j- v3 W
a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);3 y8 x e# v, w/ c
if(a[2]=='A')
6 S; c0 c/ J1 R5 z {
" O' i/ K$ U/ b1 P- K9 M& p) }" ^ status_a2=0;3 ~$ `% Y* p4 J8 c5 L
status_a3=0x01;
+ q. d. L8 ?& X6 v( p }
+ }0 c$ N, D! {! L( D; O5 j }
@8 ~, s0 Z2 l if(status_a3==0x01)
5 H9 ^- i" P/ P {
U# f6 W* W5 o, s1 x3 k$ R: O a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
3 Q( L% x3 w+ R" F if(a[3]=='N')
+ G9 E: F B/ m0 V! X3 ~$ K3 F {
% X; S/ O+ C/ G8 L, g status_a3=0;
2 l3 p) N( [) Q; Z4 E% d status_a4=0x01;; _/ \, G' w) l: M0 W' T
}
- _, B& d- L3 p8 i7 B# N0 Z2 d } ?' }% y0 Q9 F- e
if(status_a4==0x01)7 f! v& L1 Z6 _! _2 _- t: b) o
{$ c, y% K L8 ?' F
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);7 b( L1 D; W& M
if(a[4]=='G')8 x# g1 s- q; ~$ ?
{
5 |7 u! K- ]0 c/ l status_a4=0;
[' e0 d2 C# g+ k, n& F7 r status_a5=0x01;
2 ]9 a) z7 L4 d% [2 A( y2 D' `9 K }" J! T1 {4 Q) h4 n" n
}
6 U& b' t- R" g if(status_a5==0x01)/ R& A" N! d9 ?7 A/ f
{
3 v4 \' m6 N# U1 G6 N a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);6 f$ q- u* u5 k& @
if(a[5]=='E')
, E* ~* W q8 E. m* R1 U9 [ {
7 u/ }2 W3 K0 [ \/ }8 c2 B3 _ status_a5=0;
1 ]5 [6 i. A3 C0 L status_OK=0x01;
]9 r* b$ {7 ]& n# V- P }4 Q8 M7 s8 w+ b- P: s* A- z
}
9 n8 w3 @6 S& G; s8 f6 F if(status_OK==0x01)& o( y( a3 U8 R( z& b
{' x/ V: @) J& f3 s$ x
rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS); z9 ?2 e6 [+ Y& N* a4 J" s
lengthrx++;8 i4 s7 |# N+ e) D1 I
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)
& x- ?0 y, l4 @' S5 F9 D {
' ?0 x* n" e$ n' V RecState=0x01;
1 w" n3 _, P/ ~ }
1 l! T$ S& }8 |/ A3 K+ `1 U } `: f2 h0 [( n1 y4 G
. c b4 j6 J8 ~1 k }
5 P0 c; \; V- ~
* F! r, ?- d9 I/ P3 f // 接收错误
- N" d7 B" ~3 j1 W9 G$ X4 {! C) f if(UART_INTID_RX_LINE_STAT == int_id)
' T$ d) V4 n4 ~% C. A7 h: B, |- y {
: I: a9 w) ]* Z j. ` while(UARTRxErrorGet(SOC_UART_0_REGS))
S6 N& K. O- M' ?) W; o {
. J$ d8 U( D" C6 F6 F$ b$ v0 D+ h // 从 RBR 读一个字节
3 m8 |6 Y& c. L5 Q$ U/ \% k UARTCharGetNonBlocking(SOC_UART_0_REGS);
" O$ J' S: b( o }
; k; W1 I9 e( @: D$ ~6 R, [" } }4 m9 o3 s8 i" @: n9 j4 S
6 y# Y3 j }+ a( x( B, M/ [ return;
. }0 o# D- a8 t/ Q' f2 \3 F}+ b3 B u' J! c
( u% G$ K* Q, o8 H2 a$ K
9 w' J" E" \2 s4 a% X1 y
- H6 o% E/ O+ t% e4 q
|
|