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

📄 spi.c

📁 avr atmega168v spi的程序
💻 C
字号:
// **************************************************************
// ***         实验:        SPI Interface Slave              ***
// ***                       2007年10月13日                   ***
// ***         目标MCU:MEGA168v     晶振:内部  8MHZ          ***
// **************************************************************
//set_bit:PORTD |=(1<<PORTD3);
//clr_bit:PORTD &=~(1<<PORTD3);
#include<iom168v.h>
#include<macros.h>
#include<myfun.h>

//**PORT_Init()**//
void PORT_Init()
{
 DDRD |=(1<<DDD7);//Interrupt output
 PORTD |=(1<<PORTD7);//set high
}

//*************************************************
//******************  USART  **********************
//*************************************************
#define USART_DDR DDRD
#define DDR_TX DDD1
#define USART_PORT PORTD
#define USART_RX PORTD0
//***********串口初始化******************************* 
//内部8Mhz频率,设置波特率9.6k,8位数据位,
//无校验,1位停止位
void USART_Init(void) 
{  
  USART_DDR |=(1<<DDR_TX);   //set TX output
  USART_PORT |=(1<<USART_RX);  //RX pull up 
   
  UCSR0B = 0x00; //设置波特率之前先关闭串口
  UCSR0A = 0x00;
  UBRR0H=0;
  UBRR0L=51;
  //UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//enable
  UCSR0B=(1<<RXEN0)|(1<<TXEN0);
  UCSR0C=(1<<UCSZ00)|(1<<UCSZ01);//8 data,1 stop 
}
//***************串口发送数据函数***************************
void USART_Transmit(unsigned char data)  //查询方式发送接收字符函数 
 { 
  while( !(UCSR0A & (1<<UDRE0)))     //等待发送缓冲区为空
        ;                   
  UDR0 = data;
 }   
//*************************************************
//**************** USART_over *********************
//*************************************************
//*************************************************
//******************  SPI  ************************
//*************************************************
#define DDR_SPI DDRB
#define DDR_SS DDB2
#define DDR_MOSI DDB3
#define DDR_MISO DDB4
#define DDR_SCK DDB5
#define SPI_SS PORTB2
//**SPI_SlaveInit()**//
void SPI_SlaveInit(void)
{
 DDRB = (1<<DDR_MISO);//设置MISO 为输出,其他为输入
 SPCR = (1<<SPE)|(1<<SPIE);//enable SPI,SPI interrupt
}
//**SPI_SlaveTransmit()**//
void SPI_SlaveTransmit(unsigned char cData)
{
    SPDR=cData;
	PORTD &= ~(1<<PORTD7);//clr
	Delayms(10);
	PORTD |= (1<<PORTD7);//set
	Delayms(10);
}
//**SPI_SlaveReceive()**//
unsigned char SPI_SlaveReceive(void)
{
 while(!(SPSR & (1<<SPIF)))//等待接收结束
       ;
 return SPDR;//返回数据
}
//**********中断服务程序*********************
#pragma interrupt_handler SPI_ovf_isr:18
void SPI_ovf_isr(void)
{
 unsigned char temp_data;
 temp_data=SPI_SlaveReceive();
 USART_Transmit(temp_data);
}
//*************************************************
//******************  SPI_over  *******************
//*************************************************
void main(void)
{
 unsigned int num=0;
 
 CLI();
 PORT_Init();
 USART_Init();
 SPI_SlaveInit();
 SEI();

 while(1)
      {
	   //PORTB &= ~(1<<PORTB0);//clr
	   //Delayms(1);
	   //PORTB |= (1<<PORTB0);//set
	   //Delayms(1);
	   SPI_SlaveTransmit(num++);
	   Delayms(10);
	   if(num==0xFF)
	         num=0;
	  }
}

⌨️ 快捷键说明

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