📄 spi_slave._c
字号:
#include "SPI_slave.h"
#include "qep.h"
unsigned char SPI_rx_buf[SPI_size];
unsigned char SPI_tx_buf[SPI_size];
unsigned char rx_index;
unsigned char tx_index,SPI_tx_flag,SPI_rx_flag;
unsigned char temp;
extern int qep_cnt[QEP_size];
extern unsigned char pwm_value[2];
#pragma interrupt_handler spi_stc_isr:11
void spi_stc_isr(void)
{
if(SPI_tx_flag)
{
SPDR=SPI_tx_buf[tx_index++];
}
else SPDR=0xee;
temp=SPDR;
if(temp==0xaa||temp==0x55)
SPI_rx_flag=1;
if(tx_index>=SPI_size)
{
tx_index=0;
SPI_tx_flag=0;
}
if(SPI_rx_flag)
{
SPI_rx_buf[rx_index]=temp;
if (rx_index<SPI_size) rx_index++;
else
{
rx_index=0;
SPI_rx_flag=0;
switch(SPI_rx_buf[0])
{
case 0xaa:
switch(SPI_rx_buf[1])
{
case 0x00:
qep_cnt[0]=0;
qep_cnt[1]=0;
break;
case 0x01:
SPI_tx_buf[0]=0x55;
SPI_tx_buf[1]=(*(unsigned char*)(qep_cnt));
SPI_tx_buf[2]=(*((unsigned char*)(qep_cnt)+1));
SPI_tx_flag=1;
break;
case 0x02:
SPI_tx_buf[0]=0x56;
SPI_tx_buf[1]=(*(unsigned char*)(qep_cnt+1));
SPI_tx_buf[2]=(*((unsigned char*)(qep_cnt+1)+1));
SPI_tx_flag=1;
break;
default:
break;
}
break;
case 0x55:
pwm_value[0]=SPI_rx_buf[1];
pwm_value[1]=SPI_rx_buf[2];
break;
default:
break;
}
}
}
}
//从机模式
void spi_init(void)
{
unsigned char temp;
//MISO=ouput and MOSI,SCK,SS = input
DDRB |=BIT(MISO);
PORTB |=BIT(MISO); //MISO上拉电阻有效
DDRB&=~BIT(SS);
SPCR = 0xC7; //SPI允许,从机模式,MSB,允许SPI中断 极性方式01,1/4系统时钟速率
SPSR = 0x00;
temp = SPSR;
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
SPI_tx_flag=0;
SPI_rx_flag=0;
rx_index=0;
tx_index=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -