📄 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);//clr,input
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 + -