⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_ad_control.c

📁 此源码是利用altera公司的nios II IDE开发的源码
💻 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 + -