|
|
OMAPL138双核通信,现在需要DSP核中的UART0接口。" {! E* r" g3 ?7 w
我是在DSP初始化这不太明白。+ w. ^3 I/ f- e% J3 t
初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。0 J& b" Q# E& o
/ Z0 P+ e. F0 B i9 a
" c' N+ E8 \0 u+ r首先 PSCInit();//UART0使能5 {/ q8 L4 ]. m
void PSCInit(void)3 Y' D1 J- P& E4 ]& `
{+ N/ \( x) ~# P
// 对相应外设模块的使能也可以在 BootLoader 中完成" X+ ?5 i$ T8 L7 f q0 t1 F( i7 H
// 使能 UART0 模块
' W7 }+ H5 N( }( [9 D0 G PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);; `7 u& j3 B8 ]+ M! O9 J$ Y# a
}5 x. r5 ~+ q/ [* p- B) E
' M& Z/ V$ y; P7 H" T9 A! E7 [4 x: P1 B1 ~+ z) r
然后是 双核通信的初始化 AppInit();; X" j- Y c* z/ p
void AppInit(void)3 X8 p% u7 k4 y" k6 H
{
7 G5 s' _* n3 s1 G, y$ t% @ /* Structure to initialize IPC (see Ipc.h for definitions) */
/ M. A a7 G4 X" A9 u9 V K struct IPC_cfg ipcCfg = {
2 D" s! }4 ~& L+ K7 J' h7 b IPC_DSP0, /* local processor Id */8 K9 s9 x" b2 [) o! M" p4 H
IPC_ARM_HOST, /* remote processor Id */
. O: U7 H' W7 C( V IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */) m( g9 ` Y7 h; \
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */
6 a% l+ E' \( A/ n; o* n5 Q) Y& b NUM_MAX_EVENT, /* maximum number of events to be created */
4 e$ t3 H& ?" p &ipcPvMemDsp, /* local side private IPC memory */
& m1 z+ q1 ?3 ?( G0 W/ w* E5 e &ipcPvMemArm /* remote side private IPC memory */
0 I6 v9 m4 Y1 c6 V4 v };9 L( k; }3 Z! l- e0 F9 e/ W% {
IntDSPINTCInit();' G/ G# `* y2 o/ f4 Q+ c s8 M6 `
IPC_init(&ipcCfg);
/ C( o0 a/ r' S4 Y IPC_intRegister(C674X_MASK_INT5);' N, J B' B" D( Z. O& W9 |
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));
5 d) \8 @8 g" ~8 z+ f
1 `) J8 j/ \* [! L /* Enabling interrupts for DSP C674x CPU */
?+ F" E% g n7 c4 |1 g IntGlobalEnable(); /* Enable C674x global interrupt */" U1 g0 W/ {$ s2 {6 g
iAssert (Notify_start()); /* This will enable IPC interrupt */7 Z: y& K* w# t. L
}0 a( V; W5 S2 C+ ]" }& {4 a
4 n2 @# z5 c% S! Z9 n6 a# s然后是 3 P* b3 H0 K4 G6 h
// UART 初始化
/ D) C/ v4 o2 {7 e& f- b8 f% H$ F UARTInit();& _; \. g: u8 P
( `" ?# Z6 r+ Y! V5 l( w8 Y7 n
// UART 中断初始化" x7 v6 R* b0 k
UARTInterruptInit();; a* j; v7 Z- l/ \7 G
# y f/ G5 H4 A5 X% D3 |' `
! g* O6 }7 B1 @2 [; w
void UARTInit(void)
/ a/ Z- y) E' t, Y{
6 E2 m K9 D$ |1 p7 ^' U9 T0 T i/ z // 配置 UART0 参数7 j# ~: u" u4 D+ Y2 h% Z/ V
// 波特率 115200 数据位 8 停止位 1 无校验位
3 Y4 ]3 \- h- C4 I" {& O# @ UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,8 M, g u$ o% o) V- x* S
UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 `3 T/ l0 Y/ P
// 使能 UART0
4 d @/ A5 H8 \ j3 v" N UARTEnable(SOC_UART_0_REGS);
2 m: ?* i# M) A1 p$ e
: t4 g3 w& ?4 l/ K9 m" @3 |' l4 V // 使能接收 / 发送 FIFO$ n$ m+ w; G3 W' A/ C+ C" ?/ r8 t
// UARTFIFOEnable(SOC_UART_0_REGS);
2 t; H {2 o" @) `: }2 b
" K B- f. [1 Y$ v: ~( j UARTFIFODisable(SOC_UART_0_REGS);
$ a: B6 q8 J( R. s, s0 f2 k3 {; r
9 B, O" }: p: U% m U // 设置 FIFO 级别 接收FIFO的级别; Y+ V4 |; @7 g8 P2 l. S4 [: w
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);% {7 F9 c6 u3 ]- C
}
/ o8 l' g+ p" P3 r7 d: F0 z. c, L2 @9 [# J" O. s* C
. `! H" t7 I3 I+ {( c$ `' Y3 zvoid UARTInterruptInit(void)+ H1 t7 U0 k, y: x7 Z' ~+ a
{
8 ~& b1 e1 M- q1 P" v IntRegister(C674X_MASK_INT4, UARTIsr);
' ]0 _; w! Z7 g, g5 f* J+ Y0 | IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);) i6 N Z r [
IntEnable(C674X_MASK_INT4);
3 ]2 m4 ?% X! r5 h2 I% C4 D6 u; A, E2 O9 L2 B' A; R9 c' A
// 使能中断% a* P' ^! P5 z! B" Y
unsigned int intFlags = 0;0 d% W0 H. K1 ?
intFlags |= (UART_INT_LINE_STAT | \
) J9 K, ?1 @4 l, L; r UART_INT_TX_EMPTY | \
3 q# f6 ` ~$ c, {) o! H) O UART_INT_RXDATA_CTI);7 j8 \4 R% I( Y6 R* K( D
UARTIntEnable(SOC_UART_0_REGS, intFlags);
/ ^: t2 {" i! x) b0 U, U}2 F/ [- Z% v% E1 Z. x8 L
% j1 K, `! u2 I- `# _- ~7 x6 O
2 |% S# q; Z# ^0 v$ R9 n$ Ovoid UARTIsr()
5 R, Y) d$ @; w, t{- ?& D. p; J X( z/ r
static unsigned int length = sizeof(txArray);
) p" L0 z. H5 }; P static unsigned int count = 0;8 g$ J& y: d3 O0 m. a& m
unsigned int int_id = 0;* e( b, r- i$ v) A7 u9 V, n) N( l
. e# L& c. ?- O
3 f) X _$ g# }- E- H
! X7 L) s$ {3 K4 ]; u( | // 确定中断源/ r2 d7 C" \! Q& S& s4 L5 A; v% T
int_id = UARTIntStatus(SOC_UART_0_REGS);
% n+ e0 j9 t- T
- ]! b7 V% m+ e% x6 i$ t4 x9 s3 _ // 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。& T+ V, d P/ j( @1 u
2 G$ T) u4 B; l: h0 F+ q( _2 u5 J" t( x; q# X U
// 清除 UART2 系统中断
6 k; G- d |, ^5 y0 F4 H% t0 p IntEventClear(SYS_INT_UART0_INT);. V( y4 K4 y; \) @: x' I
# c4 b$ g8 L9 Y# _+ x // 发送中断
6 S: [( g1 `8 y* s( a) c2 b2 {- Z if(UART_INTID_TX_EMPTY == int_id)
2 Z2 b: k+ c, x8 y4 L6 u {# L/ w- E( |! }# e* ^! J2 s* f
if(0 < length)% l+ r: B2 E3 Q: y. ?* K8 a
{
! j9 l! ?# ~9 I // 写一个字节到 THR C# B" B, A9 l1 S
UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);
: A7 x+ v# R: X$ {- j0 p4 | length--;1 r& |. V& D7 }' {" v# u% {
count++;
! W) M; {6 ]2 a y }
" `8 _, G0 l* C1 ` m S4 e; S if(0 == length)* d( ~* H$ G0 `* d, h0 k2 f
{
3 q) c% @) r4 L' v$ ?3 M0 P // 禁用发送中断
3 `6 @. t) a# p' v @ UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
5 k/ c, Q- p; ]; V }
; @, Z* O+ r" A& } }1 s5 |7 @$ ]* T' l& v& W
& W" H3 d# L4 |/ } // 接收中断
1 n, Z. S1 u: ]$ i& E3 T' D! r" k if(UART_INTID_RX_DATA == int_id)
( v5 x1 l% v. T3 |; Z {
+ H: Q. ^8 X. }6 D u2 x if(status_a0==0)
$ h; v& n" L6 l8 W8 M {3 f# m: f# h) S# {$ w; i. c
a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
, o( b- R) k8 ^$ p if(a[0]=='#'): ^( X& X9 y: B4 B
{
* m* S* u9 G7 P& a1 @ status_a0=0x01;
( m3 o9 ~' D2 \& } H status_a1=0x01;
8 W# U: [ v" Z* w% x5 F }: D, u6 [: s2 j* [
}, d/ h+ l" h0 ]7 X8 k7 ~9 }
if(status_a1==0x01)
0 g1 {' c& w: I5 |7 R, Q; I+ k {
% f" R- z8 [5 R! }* g a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
9 V& Z/ Q! U9 a9 b5 b% s' L if(a[1]=='R')# I. E% V+ o0 \8 W9 `6 \2 s
{
8 d9 u( t5 I# R8 D% k) Q status_a1=0;
* T' U9 r0 F" [ }7 H status_a2=0x01;2 s; Z, A( a+ f- ^$ \7 N' [
}( d! s8 z; k$ q
}
3 A: @' O! C% W# o, ~ if(status_a2==0x01)* g* u* d' x9 N" ~& w
{
; E$ v* [2 M, `" G4 v# M3 B' V a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS); L3 b2 U) h$ \/ a0 j$ n( A# m6 t
if(a[2]=='A')
) G3 t! O! [ P, ~) P# g {2 W+ J: L% Q2 m0 A5 g
status_a2=0;
( T3 ?: J2 _ y2 M2 R5 ] status_a3=0x01;
- \8 t! p" C$ }+ M5 u, ]% t }
) A& s- Q: R1 U& z0 ^5 L }
2 Y( I! U/ J5 M: U7 M if(status_a3==0x01)
0 h5 k% [7 m4 o1 S. J8 \8 z {
- U, k* {4 Z% V6 F0 A a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
; D) ?0 M# h l3 V if(a[3]=='N')7 o0 w8 C( A4 h Q9 I
{
2 N. ]! e0 L9 P( u4 u N9 G status_a3=0;9 W6 S+ Y# y7 S3 m: n! @$ A
status_a4=0x01;
1 ~7 z5 n) u# e0 t& T: W }
8 n: `* ?% x* Y. W# _ }
( X6 ]6 e+ H) O" x/ `( T: Z if(status_a4==0x01)' Y1 Y/ y s2 ~; X$ \
{
$ w k! B4 t8 C, W! y a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
/ V0 A0 `' V6 i8 g' m/ N1 i7 _ if(a[4]=='G')
& t- i q: [ r {4 Y5 a. l" [# \- p G: {) x2 I% f
status_a4=0;
' E+ b) ?* e$ o. Z" u status_a5=0x01;" p* \% U4 J7 W& |) K& L+ V
}3 S. p6 Z$ j9 ~9 }1 ?$ N' U" v9 e
}
& |- p: @( E1 K& T$ l5 f' E# q if(status_a5==0x01)
4 t2 y; H( g8 E# S% N2 v# C {
' r, i7 H/ {; I: f& F( j6 F a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS);! p. E8 ~& Y5 _6 O; e1 a0 W9 |
if(a[5]=='E')
' r: W" C& \- m% P: ^( n {/ }& @$ n1 t% E' ?
status_a5=0;
8 l. m; @5 y [; j5 K9 J0 A7 F status_OK=0x01;2 S5 I4 D/ I* x3 U% ?3 f, F
}
; e: @. D Q7 d, x9 S# f }( a, R, E0 M; R7 R
if(status_OK==0x01): d0 K$ V$ x+ }. h6 k1 l) \4 u
{
) H$ w! u: G/ K( X) [ rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);, u8 q# O7 x2 y e: X" H' j2 X
lengthrx++;8 [- x& P' s5 F% J7 V
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)9 g! d% L0 h4 m1 h0 S
{" }/ a* m0 S/ W+ h3 Z
RecState=0x01;
7 D- C+ Y- B3 g" p }0 r B, s" T# y
}# z$ C4 v6 g" g7 P" g# E& _+ X8 \
! J/ F1 A8 V( E1 V }
; K- Y& A: O, K* F: @" Z' b; r* T/ Y8 u, ~
// 接收错误( \6 v$ T- s6 ?* l* n/ @3 p+ I
if(UART_INTID_RX_LINE_STAT == int_id)
7 J! A9 A0 O( I) S4 }' l; [! y- C {
( @( x( I' O% n$ X& Q0 N while(UARTRxErrorGet(SOC_UART_0_REGS))
! V2 T8 z- Z: P* p9 ~. m) a {# ~1 m% `( I; [" i& m& G
// 从 RBR 读一个字节
4 [7 F; b4 Y% ~+ h UARTCharGetNonBlocking(SOC_UART_0_REGS);
- n& {$ d4 }5 [- E4 Z* o7 Q9 Z }0 Q8 o- _" T' ]7 X
}; r5 Q- {$ i& y* }7 G
9 S/ D- T8 Q$ A Z
return;
8 d% X/ j0 f, h5 }& {5 y}& H+ N: } a) Z% g4 g' x
$ u% V) A, z' n y' Q5 {+ o1 ?# v5 \
; _6 m7 H$ j1 o" p2 R% S
( W2 C8 [4 N2 m2 [. N5 R1 e( W |
|