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

📄 spi.c

📁 用AVR端口模拟SPI和AD9517的通信
💻 C
字号:
#include <iom48v.h>
#include <macros.h>

#define uint unsigned  int
#define ulong unsigned long
#define uchar unsigned char

#define clk       PD0//AD_clk
#define data_IO   PD1//AD数据输入输出口
#define cs        PD2//AD片选

#define IO_DDR    DDD1//数据读入读出口 

#define IO_PIN    PIND

//#define clk_s       PD3
//#define ss_s        PD4
//#define data_s      PD5
//#define data_sPIN   PIND5
//#define data_sDDR   DDD5




void spisend(uchar data)//写入
{   
    uchar i; 
    //IO_DDR=1;
	DDRD |= 0x02;
    //clk=0;
	PORTD &= 0xfe;
    for(i=8;i>0;i--)
 {
  if ((data&0x01)==1)
   { 
   //data_IO=1;
   PORTD |= 0x02;
   }
  else 
   //data_IO=0;
   PORTD &= 0xFD;
   _NOP();
  //clk=1;
  PORTD |= 0x01;
 //_NOP(); 
  //clk=0;
  PORTD &= 0xfe;   
  data>>=1;//右移一位
 } 
} 

uchar spiread(void) //读取
{
 uchar i;
 uchar data=0x00; 
 uchar temp;  
 //IO_DDR=0;  //IO口作为输入,DDR要写0
 DDRD &= 0xfd;  
 //ss_r=0;
 //clk=0; 
 PORTD &= 0xfe;    
 for(i=0;i<8;i++)
 {   
  //clk=1;
  PORTD |= 0x01; 
  //clk=0;
  PORTD &= 0xfe;       
  temp=IO_PIN; 
        if (temp&0x02)       //下降沿采集数据,调换则会出错 
 data|=(0x01<<i);
 } 
 //IO_DDR=1;
 DDRD |= 0x02;
 //ss_r=1;  //读完数据后,SS拉高,同时时钟拉高一次,上升沿重新置数
// clk=1;
PORTD |= 0x01; 
return(data);
}

void main(ulong spidata)
{
 uint i,j;
 uchar data[4]={0,0,0,0};
 uchar instrution[2]={0,0};
 /*PORTA="0x00";   //灯指示
 DDRA="0XFF";
 
PORTB="0x00";//0101 0000
 DDRB="0x07";//0000 0111接口作为模拟SPI口输出接口要写1
 
 PORTC="0x00";
 DDRC="0x80";

 DDRD="0xff";//0000 0001 
PORTD="0x00";*///0100 1000 
    //cs = 0;
	PORTD &= 0xfc;
    for(i=0;i<2;i++)
        {
           spisend(instrution[i]);
        }
    if(instrution[0]&0x8000)
	   {
	    for(j=0;j<4;j++)
		   {
		    data[j]=spiread();
		   }
	   }
     else  {
	    for(j=0;j<4;j++)
		   {
		    spisend(data[i]);
		   }
            }
    // cs = 1;
	PORTD |= 0x40;
}		   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -