|
#include "system.h"- r/ l: C( t% C" g% q$ v
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"$ W" [8 G8 L. t8 q$ Y) l) i" I: c. M1 E
#include "sys/alt_irq.h"* a7 R6 T1 O3 b! L
volatile int edge_capture;. l+ w`( w- y
volatile int data_reset = 0;
//中断服务程序,向设备发送1024个数据$ j: d' O/ s9 t5 p
static void trans_data_to_lpc(void *context)
{[1 j! i- c: `% G6 a# \
int i = 0;. PJ, W' ~) Q% Z% v& c; M& h6 O
int j = 0;u( C* zJD7 d1 d6 uY. ^
alt_u8 data_to_lpc;
alt_u8 data_trans_req;
volatile int *edge_capture_ptr;/ a3 E9 [" L7 U[, ^3 s6 e
s9 D0 I- Y! B9 ?6 M
alt_irq_disable(PIO_LPC_DATA_REQ_IRQ);2 x/ F" d2 u0 U) H. U
, K! \8 g4 T6 e. }2 N
data_to_lpc = data_reset++;0 z0 H% X/ p! E. _9 I0 {6 v
data_trans_req = 0x00;2 d, Q+ wx' X8 N' E/ J* j5 t! w
edge_capture_ptr = (volatile int *)context;2 z) @2 `5 m% f, h
# U* \" o% \" D0 l8 I4 b1 U% c. _
IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0x00); // clear syn_clr;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0xFF); // set syn_clr;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0xFF); // set irq, start data trans;
for(i=0; i<1024; i++)( t* |+ K* b9 r* W2 f
{
data_to_lpc++;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DATA_TO_LPC_BASE, data_to_lpc); // write data% a9 R6 s' m6 W( R
data_trans_req = ~data_trans_req;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, data_trans_req); // set or clear req;4 M% T2 |; A6 {2 J1 H; P
while(IORD_ALTERA_AVALON_PIO_DATA(PIO_COM_SIGNAL_BASE))4 \8 X6 t; q: c; Z: s2 Z
{
j++;
if(j>10000000)8 `. o1 l6 \# c% Q
{: ?2 O9 Q5 {3 w6 q3 [
IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;$ Y3 H& F1 K$ y5 G0 |% }3 U9 ^0 o
alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);) B' a+ m7 @7 M' b
return; // time out;- j% I9 ?( Q+ x2 h. r
}
} // wait lpc recieve data complete;7 _$ ~( u; P' t# `
}
IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;
alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);
return;
}
3 p2 G& N0 h; F# [7 d2 ~* ^8 v
int main()# l7 W5 R' _; H4 }
{4 \7 @6 n% m! }j4 R+ c6 z5 X
alt_u8 led = 0xF; 9 ?3 b+ d) e8 D1 N# w2 H% d& B
int i = 0;
void *edge_capture_ptr = (void *)&edge_capture;( U9 V9 x. \3 a6 p& B% [
//====Init====
alt_irq_init(PIO_LPC_DATA_REQ_IRQ);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, 0x00);1 d/ e" c9 O, f1 Go
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LPC_DATA_REQ_BASE, 0x01); // Enable LSB interrupt;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LPC_DATA_REQ_BASE, 0x00); // Reset the edge capture register;
alt_irq_register(PIO_LPC_DATA_REQ_IRQ, edge_capture_ptr, trans_data_to_lpc); // Register the interrupt handler;, q9 \' b. d3 C
alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);
//============
while(1)
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//led闪烁
led = ~led;
i = 0;6 k; H+ F/ F4 y7 S6 p4 x. w
while(i<100000000)
i++;0 K6 K7 l3 d/ u5 m
}' G/ E5 ~: o4 E
return 0;
} |
|