|
OMAPL138双核通信,现在需要DSP核中的UART0接口。; b# r5 u r1 {6 o1 c7 p
我是在DSP初始化这不太明白。
' V# O) ?' u2 h3 M7 x初始化要初始双核通信的IPC和UART0。 我是按照下面的顺序进行初始化的,但是UART0接口接收不到数据。2 Y# m; ?& B f9 b" a" }
" R- q0 r1 l/ V% R* [4 L2 N7 G3 j/ e: O+ w1 [, C
首先 PSCInit();//UART0使能. ]3 I4 c7 z* x
void PSCInit(void)
' N* o( d) x+ [9 O2 D' `# R. f& V{8 c( o5 s) E/ j. K( I. Z
// 对相应外设模块的使能也可以在 BootLoader 中完成
' w& N1 Z5 `* T& L1 Z // 使能 UART0 模块; `' R R+ M9 n9 X: b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART0, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);- N ]& T- Z8 v0 @/ A4 j
} o6 P' o! ^! q$ r5 W! Z( Y
( f9 C2 l% u f5 o' s, l( ^3 u
C- T& ^: V0 T. u
然后是 双核通信的初始化 AppInit();
8 T/ \; s+ m1 G/ J- }9 pvoid AppInit(void)
2 j# Z7 {/ H3 W# C/ ^{0 t( {1 g1 V1 k* h, }
/* Structure to initialize IPC (see Ipc.h for definitions) */
! L: _4 ?+ ~8 Z. i& [! g struct IPC_cfg ipcCfg = {, w( n$ M/ \/ Z0 J1 d9 `2 {
IPC_DSP0, /* local processor Id */
6 |/ Y2 j2 M6 b* ~4 c IPC_ARM_HOST, /* remote processor Id */1 \8 Y3 F* q' d" `
IPC_HOST_INTLINE, /* ID of interrupt line to remote CPU */% e" a' ]8 N- n" o7 l! e- S
IPC_INTERRUPT_METHOD, /* Method to receive from remote processor */# i& H: [$ F3 F4 e
NUM_MAX_EVENT, /* maximum number of events to be created */
4 t; F9 u9 E/ k9 u. i &ipcPvMemDsp, /* local side private IPC memory */! s% f: ]& k" C1 F8 n7 \
&ipcPvMemArm /* remote side private IPC memory */
; z2 I* C4 b4 W6 W$ ` };
( ?# K8 l) w" C IntDSPINTCInit();% Y9 e3 ^4 B8 V/ @& B5 B$ o$ X
IPC_init(&ipcCfg);
! d9 d0 B8 A5 {( M4 _ IPC_intRegister(C674X_MASK_INT5);7 l, r, E% O( t; I" v
iAssert (Notify_registerEvent(IPC_ARM_HOST, IPC_HOST_INTLINE, EVENTID, cbFxnEvent, 0xc0de));( U D6 G- R5 }# ^
0 D" u8 J" g L+ c /* Enabling interrupts for DSP C674x CPU */% Y3 z0 _" T6 I& `0 x
IntGlobalEnable(); /* Enable C674x global interrupt */3 f8 h: d0 n2 }5 I3 |0 J
iAssert (Notify_start()); /* This will enable IPC interrupt */
" V: X6 e6 m% O: m6 A}7 k5 G9 h( l7 R, a: |
* \. z8 h' |! s( m然后是
& t, c5 p4 W3 d0 I& w. a // UART 初始化- a4 _7 e" X0 ]9 n9 I8 o- Y# t t& u$ w
UARTInit();7 V5 C) W- ?+ ?$ J, D9 A
- y0 S: V1 u, `* I7 ]5 T // UART 中断初始化
/ p6 b) Z! b% g, x9 b UARTInterruptInit();* q Q) ~+ w* n0 X! h
0 X ^6 g# A% e' A6 L9 T
1 e9 }/ R: r G6 q) \
void UARTInit(void), M9 w8 W0 E" }
{: z9 c( X$ l4 V0 d
// 配置 UART0 参数
3 Q6 [3 N% ^+ f5 B% U$ t7 b$ \ // 波特率 115200 数据位 8 停止位 1 无校验位* n* A9 D" H/ H2 A" I
UARTConfigSetExpClk(SOC_UART_0_REGS, UART_1_FREQ, BAUD_115200,
, _+ W( T; L9 V4 W8 U UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);) n5 _6 Q, D0 \! a5 l
// 使能 UART0/ `$ A, O4 `* w9 H! J8 T6 c9 z
UARTEnable(SOC_UART_0_REGS);- `. u- ^; [8 Y( U
; G2 U" a P+ `& I6 Y
// 使能接收 / 发送 FIFO
( b% s# \& X' ~2 U5 h// UARTFIFOEnable(SOC_UART_0_REGS);$ w- [" O! c" M: b. _; {5 O
2 m& E; k+ ^, K& b) D* h" E6 Q
UARTFIFODisable(SOC_UART_0_REGS);% `- U2 f1 j) q, Y R$ s. _$ n
1 h, t" Q( h; A, ^) [5 U
// 设置 FIFO 级别 接收FIFO的级别3 Q. h" J) F/ d! d3 ^
// UARTFIFOLevelSet(SOC_UART_0_REGS, UART_RX_TRIG_LEVEL_1);4 |: E; L0 `# v+ h
}% @3 d7 }# l0 {% }" Y
" A# u7 }4 C: c( {4 ^8 w
; L) G, J8 J* D1 n/ ^2 Z( b4 Pvoid UARTInterruptInit(void)& b5 O& N* F% G5 V3 \: V, _
{
1 T: s- m, z7 ~* R3 Y* v IntRegister(C674X_MASK_INT4, UARTIsr); l5 v; o$ S! C; s! E- {( {* D
IntEventMap(C674X_MASK_INT4, SYS_INT_UART0_INT);) q+ o; E+ k( L
IntEnable(C674X_MASK_INT4);
' Q+ u8 |" u' h( c8 A! z4 t7 B7 E; h
// 使能中断4 i; O6 x. g* v: X9 `
unsigned int intFlags = 0;
2 B! V* ^% k% A# B! `6 _ intFlags |= (UART_INT_LINE_STAT | \
' k$ W/ {# n- z& `- @( X. B8 B2 y UART_INT_TX_EMPTY | \
. N) |/ Y& X: b! \$ l2 x/ W UART_INT_RXDATA_CTI);
3 R$ o1 s: c% {- m0 O9 Z: d: m UARTIntEnable(SOC_UART_0_REGS, intFlags);
- j$ a: E3 j+ b6 Q$ F& R}
( q1 }- Y" l# ?3 C4 O: X4 z
$ r( H! R9 y. k6 w% y3 m; y8 Z4 z* p1 t b' U
void UARTIsr()3 J" A; D* k9 G; L3 g
{
/ R3 N% T* h5 G. M, J; c E static unsigned int length = sizeof(txArray);
! G5 c& }7 L% v0 `, j static unsigned int count = 0;
8 p6 S/ D$ z, J5 H" k unsigned int int_id = 0;, Y; Q9 a; N- J& v4 b
2 k5 P0 n. u' q% O, V; m; ~
$ _4 Y: Y! T& ~3 Y. M: }8 d' o
1 j7 G/ @/ G2 ~1 U' S // 确定中断源
7 m9 n5 [0 a/ ]* f5 D. B int_id = UARTIntStatus(SOC_UART_0_REGS);. Z0 t6 R+ ? o* V# ~6 r! I
6 b" D/ b7 @4 V/ Y; m
// 清除 UART0 系统中断 软件清除中断,进入中断服务函数后,中断不能自动清除,必须使用软件清除,若违背及时清除,则退出中断函数使会发生混乱。
5 b6 \$ v. Y" `/ S0 l
: E( [5 R/ d8 i
9 L- x; |2 V2 E/ t6 z% ~5 `; g4 y: A( a2 \8 _ // 清除 UART2 系统中断' r6 Q7 O) f4 G( }
IntEventClear(SYS_INT_UART0_INT);5 \& @8 \5 L* u% S
! P( p. w2 N2 e" `9 \* U# n
// 发送中断+ Z! m, L# B/ f3 `# _. r" R
if(UART_INTID_TX_EMPTY == int_id)
* @$ a; R# G/ q& T1 V0 I5 s, c9 d {# @: e3 u3 a7 O
if(0 < length)3 |' x* l! C; O$ ?/ [5 ]
{
" ^, G8 k+ |9 m ~$ R( c) T // 写一个字节到 THR
* e8 u# M' z8 v) v& U UARTCharPutNonBlocking(SOC_UART_0_REGS, txArray[count]);6 E& X9 C) n* H4 |+ S
length--;
- Z8 o& t0 b+ G- b( F& t count++;8 \* I, |( P# x
}) V" p) C9 `: f6 |
if(0 == length)
1 y; R& q7 l7 x {
: i# d8 d- j4 u% D: p: q( L // 禁用发送中断
0 j4 K( U% W1 ~2 g7 F4 ^ UARTIntDisable(SOC_UART_0_REGS, UART_INT_TX_EMPTY);
, Q& _3 _; c; } K U0 v, V }
& ~: c4 U: j) o( i4 y3 B }' \2 n; p: E: b, K! J$ _
; L, s1 S1 u9 j2 Q
// 接收中断
% R; E6 C1 Z. Q" k' G2 _7 z if(UART_INTID_RX_DATA == int_id)
! y2 a0 e# B. m {; G3 _8 _" s) l& H& n9 d
if(status_a0==0)& E0 t h; m" p! m: L) g5 i
{
2 A+ A% l" E3 ^& [! a a[0]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
1 Q. a# [1 g) h& T0 I ?% Y. k if(a[0]=='#'); k- p+ B( `- w, G) g. M3 G
{
5 m9 _: l1 X, p2 f status_a0=0x01;
# f# B& x3 `/ r! h status_a1=0x01;, N8 o1 @2 _. k K, |5 f& |
}( M" S- |0 F* G% K. N; x
}
/ B& T1 {, ^7 v2 U+ m' v if(status_a1==0x01)' i- v2 N H, N6 P
{
% b- Q: Y$ j) N5 | a[1]=UARTCharGetNonBlocking(SOC_UART_0_REGS);$ y0 g5 S1 Y2 S1 F
if(a[1]=='R')9 o# y% r" ?3 s" A5 m+ A( w
{
; W9 y% Z+ N( S4 X( f status_a1=0;
+ ^5 f' s! q- f% m6 J& D status_a2=0x01;
% X) R2 G+ ]# M. S }, g; b% `7 i$ g% P$ W
}
/ j Z! Q v4 N- G if(status_a2==0x01)
- L7 ^+ z) C1 P5 J% `* U {
2 H4 l/ N( f) \: N6 t a[2]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
% H) g( I1 s r$ P if(a[2]=='A')
: _7 x1 V; U) |! I3 X$ J E1 }' e. P% z% f {
5 |1 p; P1 C! I; ~' y' ? status_a2=0;' f( C$ H4 ~3 r E
status_a3=0x01;
. l; s7 \( [3 s" j }
/ V8 o' ]$ |7 r8 T7 c+ p! H* s }
+ U* i2 C: o' z; F if(status_a3==0x01). U9 g- B* ~! A5 s- y% `5 W& d$ W
{; a# g( r" L5 |7 N* P9 Q
a[3]=UARTCharGetNonBlocking(SOC_UART_0_REGS);" f- a* C g% c
if(a[3]=='N')
' ]4 G: Y6 j+ Z( a {
) ^3 ?" ^1 N' n! c _ status_a3=0;
/ \& G2 P* p& U. y, ~ status_a4=0x01;8 m! a* _ N% z0 j4 K
}
9 @( c6 w5 l* M5 W% K1 G1 z }9 b, j; d2 I4 Z7 m5 ~2 d, [/ ]/ d
if(status_a4==0x01)
) ?. |0 [& l7 B A. t8 n {# Z; L& v! X: c1 X
a[4]=UARTCharGetNonBlocking(SOC_UART_0_REGS);
4 J; R: B; h8 o; t/ p. ~ if(a[4]=='G')5 a4 K& L7 v8 W3 M
{' m0 }$ N( _+ n5 B/ B
status_a4=0;
- v {4 l$ c1 Y4 L* V status_a5=0x01;. D9 M0 T2 c# n3 y2 K3 K1 v
}5 r! {) t4 G3 W' r! ^
}
- h2 D* K; z5 o( p1 T$ S if(status_a5==0x01)8 L, T% K; l& Q
{, w& [+ j \. J+ }
a[5]=UARTCharGetNonBlocking(SOC_UART_0_REGS); O, k6 e' d# [* D7 G
if(a[5]=='E')
6 o; t5 w5 a1 Y$ d {
C+ v' W8 n* z" b( F2 e3 S status_a5=0;
/ Z# K. X# U! | status_OK=0x01;/ Y- Z7 R( @9 ^2 n( G
}- t& g/ o8 i* J8 P% Y& P
} E0 N% `. V# x. g' d' C" n
if(status_OK==0x01)
' V' M8 y* X4 ~4 g& K* l {
$ s2 ~% {$ I- N rxData[lengthrx]=UARTCharGetNonBlocking(SOC_UART_0_REGS);& u' c7 G/ S) i) m
lengthrx++;4 `# D$ g; I* \- _6 _& A, X% J
if(lengthrx==10000)//可从这里加多个矩阵 if(100或其他值)$ c; P: w% j; |0 c' l$ g' z
{
1 ^4 G- f! W6 n6 G RecState=0x01;
# A( Y0 n+ I9 a' c7 K j$ } }
7 s9 p' D8 C& c& H5 x& o }
$ I1 H4 J$ X+ r- @; k5 m; r% o! ?* Q- i* f2 H( E
}
9 y" Z; S7 L# q+ x+ j
( z4 b1 R- s: D& L // 接收错误0 S$ u# y( {4 G6 S. }7 R+ Q
if(UART_INTID_RX_LINE_STAT == int_id). `$ z- w0 b$ t/ L ~' `
{
7 d' w+ M$ G$ ]+ b$ Q8 Y while(UARTRxErrorGet(SOC_UART_0_REGS))* S+ Y/ {- o; p4 K/ C$ {
{8 q8 U5 k3 M3 M, ^. m' X
// 从 RBR 读一个字节
( S1 r& w# u; k UARTCharGetNonBlocking(SOC_UART_0_REGS);
/ e) v2 h! v. i6 \" W }
8 W) ^/ b# q4 n) T7 P- B# ]" Q# G }
9 N/ x/ @( ?4 g/ C* O% V; `* [* L1 L( w8 c2 K3 _6 M
return;
5 {" y8 A- C7 l1 ]- ^/ s}
M5 n# Q2 }, ]6 `0 c( _- V4 h- |8 d1 Y: J* i" n5 a9 V
+ N' p4 a# S* l& [5 R3 K
2 r* p, l; i$ B# ~1 Y4 S7 }: a3 s
|
|