📄 spi_ad_control.c
字号:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "system.h"
#include "sys/alt_irq.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "io.h"
#include "altera_avalon_timer_regs.h"
#include "alt_types.h"
alt_u32 c[64];
int flag_p;
void send(alt_u32 a){
unsigned char i;
IOWR_ALTERA_AVALON_PIO_DATA(DAC_CS_BASE,0);
usleep(5);
for (i=0;i<16;i++){
if ((a&0x8000)==0)
IOWR_ALTERA_AVALON_PIO_DATA(DAC_DATA_BASE,0);
else
IOWR_ALTERA_AVALON_PIO_DATA(DAC_DATA_BASE,1);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(DAC_SCLK_BASE,1);
a=a<<1;
IOWR_ALTERA_AVALON_PIO_DATA(DAC_SCLK_BASE,0);
usleep(10);
}
IOWR_ALTERA_AVALON_PIO_DATA(DAC_CS_BASE,1);
}
unsigned int receive(){
unsigned char j;
alt_u32 c=0;
IOWR_ALTERA_AVALON_PIO_DATA(ADC_CS_BASE,0);
usleep(5);
for (j=0;j<16;j++){
c=c|IORD_ALTERA_AVALON_PIO_DATA(ADC_DATA_BASE);
usleep(10);
IOWR_ALTERA_AVALON_PIO_DATA(ADC_SCLK_BASE,1);
c=c<<1;
IOWR_ALTERA_AVALON_PIO_DATA(ADC_SCLK_BASE,0);
usleep(10);
}
IOWR_ALTERA_AVALON_PIO_DATA(ADC_CS_BASE,1);
return c;
}
unsigned int sent_to_DA(alt_u32 d)
{ unsigned char i;
IOWR_ALTERA_AVALON_PIO_DATA(DAC_CS_BASE,0);
for(i=0;i<16;i++)
{ if((d&0x8000)==0)
IOWR_ALTERA_AVALON_PIO_DATA(DAC_DATA_BASE,0);
else
IOWR_ALTERA_AVALON_PIO_DATA(DAC_DATA_BASE,1);
IOWR_ALTERA_AVALON_PIO_DATA(DAC_SCLK_BASE,1);
d=d<<1;
IOWR_ALTERA_AVALON_PIO_DATA(DAC_SCLK_BASE,0);
}
IOWR_ALTERA_AVALON_PIO_DATA(DAC_CS_BASE,1);
}
unsigned int ADDA(void)
{ alt_u32 b[64]={0xc800,0xc8c0,0xc980,0xca50,0xcb00,0xcbc0,0xcc60,0xcd00,
0xcda0,0xce20,0xcea0,0xcf00,0xcf50,0xcfa0,0xcfd0,0xcfe0,
0xcff0,0xcfe0,0xcfd0,0xcfa0,0xcf50,0xcf00,0xcea0,0xce20,
0xcda0,0xcd00,0xcc60,0xcbc0,0xcb00,0xca50,0xc980,0xc8c0,
0xc800,0xc730,0xc670,0xc5a0,0xc4f0,0xc430,0xc390,0xc2f0,
0xc250,0xc1d0,0xc150,0xc0f0,0xc0a0,0xc050,0xc020,0xc010,
0xc000,0xc010,0xc020,0xc050,0xc0a0,0xc0f0,0xc150,0xc1d0,
0xc250,0xc2f0,0xc390,0xc430,0xc4f0,0xc5a0,0xc670,0xc730};
alt_u32 x;
unsigned char i,j;
float y;
int n,m=0;
for(j=0;j<200;j++)
{
for (i=0;i<64;i++)
{ send(b[i]);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,2);
x=receive();
x=x>>1;
x=x&0x0ff0;
c[i]=x|0x4000; //???AD ?a?????
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,4);
sent_to_DA(c[i]);
x=x>>4;
y=x;
y=y*5/256;
}
}
}
static void handle_key_interrupts(void*context,alt_u32 id)
{ volatile int *edge_cap=(volatile int*)context;
alt_u8 out;
*edge_cap=IORD_ALTERA_AVALON_PIO_DATA(KEY_16_BASE);
switch(*edge_cap){
case 0x00 :
out=0; break;
case 0x70 :
out=7; break;
case 0x80:
out=8; break;
case 0x90:
out=9; break;
case 0x40:
out=4; break;
case 0x50:
out=5; break;
case 0x60 :
out=6; break;
case 0x10:
out=1; break;
case 0x20:
out=2; break;
case 0x30 :
out=3;break;
}
if((out==0)||(out==1)||(out==2)||(out==3)||(out==4)||(out==5)||(out==6)||(out==7)||(out==8)||(out==9))
{
printf("\n you have input:%d\n",out);
}
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_16_BASE,0);//edgecapture??
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_16_BASE,0xff);//reset irq mask
}
static void handle_button_interrupts(void*context,alt_u32 id)//F1~F4
{ int a;
volatile int*edge_capture_ptr=(volatile int*) context;//cast the context pointer to an integer pointer
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
a=*edge_capture_ptr;
printf("you hit the button:%d\n",a);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);//edgecapture??
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xff);//reset irq mask
IOWR_ALTERA_AVALON_PIO_DATA(SEVEN_SEG_PIO_BASE,*edge_capture_ptr);
}
static void handle_adda_control_interrupts(void*context,alt_u32 id)//
{ int n;
volatile int*edge_capture_ptr=(volatile int*)context;
printf("you have hit AD_DA control button \n");
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,1);
ADDA();
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(AD_DA_CONTROL_BASE,0x1);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0);
//flag_p=1;
for(n=0;n<64;n++)
{
printf("data:%d.\n",c[n]);
}
}
static handle_Timer0_interrupts(void* context, alt_u32 id)
{alt_u16 a;
alt_u16 b;
volatile alt_u16 *countptr = (volatile alt_u16 *)context;
IOWR_ALTERA_AVALON_TIMER_STATUS(SYS_CLK_TIMER_BASE, 0);//?TO?
a = *countptr; //??count???
a=a<<1; //????
if (a == 0x100) a=1; //?led????
*countptr=a; //?????count
b=~a;//????????LED???????
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, b); //??LED???
}
int main(){
volatile int edge_capture;//Declare a global variable variable to hold the edge capture value
volatile int edge_capturee;
volatile int edge_cap;
volatile alt_u16 count;
count=1;
char buffer[20];
char *msg="Hello uart!";
int n;
int uart_ctl;
alt_irq_register(BUTTON_PIO_IRQ,(void*)&edge_capture,handle_button_interrupts);//??????
alt_irq_register(AD_DA_CONTROL_IRQ,(void*)&edge_capturee,handle_adda_control_interrupts);
alt_irq_register(SYS_CLK_TIMER_IRQ, (void *)&count, handle_Timer0_interrupts);
alt_irq_register(KEY_16_IRQ, (void *)&edge_cap, handle_key_interrupts);
IOWR_ALTERA_AVALON_TIMER_PERIODL(SYS_CLK_TIMER_BASE, 0x0000);
IOWR_ALTERA_AVALON_TIMER_PERIODH(SYS_CLK_TIMER_BASE, 0x0100);
IOWR_ALTERA_AVALON_TIMER_CONTROL(SYS_CLK_TIMER_BASE, 7);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_16_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(AD_DA_CONTROL_BASE,0x1);
FILE *fp;
if(fp=fopen(UART1_NAME,"r+"))
{
printf("Success!");
fprintf(fp,"\nplease input:%s\n",msg);
printf("\nplease input:%s",msg);
while(1)
{
fgets(buffer,20,fp);
fprintf(fp,"You have input a string:%s\n",buffer);
if((buffer[0]=='E')&& (buffer[1]=='n')&& (buffer[2]=='d'))
{fclose( fp );
fprintf(fp,"\nClose uart\n");
}
}
}
else printf("Faild!");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -