📄 spi_slave
字号:
#pragma interrupt_handler spi_stc_isr:11
#include "SPI_slave.h"
unsigned char SPI_rx_buff[SPI_size];
unsigned char SPI_tx_buff[SPI_size];
unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsigned char tx_wr_index,tx_rd_index,tx_counter;
unsigned char CntByte=0;
unsigned char frame[3];
unsigned char temp;
//数据包格式:第一个字节是表示是命令还是数据包:0xaa是命令包
// 0x55是数据包
// 第二,三个字节是表示什么命令及数据
void spi_stc_isr(void)
{
temp=SPDR;
if(CntByte<3)
frame[CntByte]=temp;
else
{
i=0;
switch(frame[0])
case 0xaa:
{
switch(frame[1])
case 0x01:
putSPIchar(0x55);
putSPIchar(*(unsigned char*)(qep_cnt));
putSPIchar(*((unsigned char*)(qep_cnt)+1));
break;
case 0x02:
putSPIchar(0x55);
putSPIchar(*(unsigned char*)(qep_cnt+1));
putSPIchar(*((unsigned char*)(qep_cnt+1)+1));
break;
default:
break;
}
case 0x55:
pwm_vaule[0]=frame[0];
pwm_vaule[1]=frame[1];
break;
case 0x00:
break;
default:
break;
}
SPI_rx_buff[rx_wr_index] = temp;
if (++rx_wr_index == SPI_size) rx_wr_index = 0; //放入接收缓冲区,并调整队列指针
if (++rx_counter == SPI_size)
{
rx_counter = 0;
rx_buffer_overflow = 1;
}
if (tx_counter) //如果发送缓冲区中有待发的数据
{
--tx_counter;
SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针
SPI_ok=0;
if (++tx_rd_index == SPI_size) tx_rd_index = 0;
}
}
void putSPIchar(char c)
{
while (tx_counter == SPI_size);//发送缓冲区满,等待
SPI_tx_buff[tx_wr_index] = c; //将数据放入发送缓冲区排队
if (++tx_wr_index == SPI_size) tx_wr_index = 0; //调整指针
++tx_counter;
}
unsigned char getSPIchar(void)
{
unsigned char data;
while (rx_counter == 0); //无接收数据,等待
data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据
if (++rx_rd_index == SPI_size) rx_rd_index = 0; //调整指针
CLI();
--rx_counter;
SEI();
return data;
}
//从机模式
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_ok=1;
SPI_datain=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -