📄 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 + -