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

📄 spi._c

📁 avr atmega168v spi的程序
💻 _C
字号:
// **************************************************************
// ***         实验:        SPI Interface  Master            ***
// ***                       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>

//*************************************************
//******************  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_PORT PORTB
#define SPI_SS PORTB2
//**SPI_MasterInit()**//
void SPI_MasterInit(void)
{
 DDR_SPI = (1<<DDR_SS)|(1<<DDR_MOSI)|(1<<DDR_SCK);//Port initialize 
 SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);//enable SPI,Master,fosc/16
}
//**SPI_MasterTransmit()**//
void SPI_MasterTransmit(unsigned char cData)
{
 SPI_PORT &=~(1<<SPI_SS);
 SPDR = cData;//启动数据传输
 while(!(SPSR & (1<<SPIF)))//等待传输结束
      ;
 SPI_PORT |=(1<<SPI_SS);
}
//**SPI_MasterReceive()**//
unsigned char SPI_MasterReceive(void)
{
 SPI_MasterTransmit(0x00);
 return SPDR;
}
//**********中断服务程序*********************
/*#pragma interrupt_handler SPI_ovf_isr:18
void SPI_ovf_isr(void)
{
 unsigned char temp_data;
 temp_data=SPDR;
 USART_Transmit(temp_data);
}*/
//*************************************************//
//******************  SPI_over  *******************//
//*************************************************//

//*************************************************
//******************   INT   **********************
//*************************************************
//**INT_Init()**//
void INT_Init()
{
 DDRD &= ~(1<<DDD2);
 EICRA |= (1<<ISC01);//h2l trig
 EIMSK |= (1<<INT0);//set INT0 open
}
#pragma interrupt_handler INT0_ovf_isr:2  
void INT0_ovf_isr(void)
{
   unsigned char temp_data;
   temp_data=SPI_MasterReceive();
   USART_Transmit(temp_data);  
}
//*************************************************
//****************** INT_over *********************
//*************************************************

void main(void)
{
 CLI();
 INT_Init();
 USART_Init();
 SPI_MasterInit();
 SEI();
 
 while(1)
    {
     ;	 
	 //USART_Transmit(temp_data);
    }
}

⌨️ 快捷键说明

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