📄 spi.c
字号:
//SPI initialisation
// clock rate: 2000000hz
#include "iom163.h"
#include <macros.h>
#define SPI_WAIT_COMMAND 0
#define SPI_WRITE_LOW 1
#define SPI_WRITE_HIGH 2
#define SPI_READ_LOW 3
#define SPI_READ_HIGH 4
#define SPI_ERR 5
unsigned char vfd_address=0;
unsigned char spi_command=0;
extern unsigned char g_vfd_grid_buffer[];
//unsigned char buffer[24];
extern unsigned int dvd_key;
void spi_err(void);
void spi_init(void)
{
SPCR= 0x00; //diable spi
SPSR= 0x00; //2X
//SPCR= 0xEC; //setup SPI CPOL:1;CPHA:1;
}
#pragma interrupt_handler spi_stc_isr:11
void spi_stc_isr(void)
{
//byte in SPDR has been sent/received
register unsigned char spi_status,spi_data,i;
//SPCR &=0x7f; //disable spi interrupt
spi_status = SPSR;
spi_data = SPDR;
//Set_FS2(0);
//Set_FS1(1);
if(spi_status&0x40)
{
spi_err();
return;
};
switch(spi_command)
{
case SPI_WAIT_COMMAND:
if((spi_data&0xC3)==0x42)
{ //read key
asm("SBI 0x17,6");
SPDR =(unsigned char)dvd_key;
spi_command= SPI_READ_LOW;
}
else if((spi_data&0xC0)==0xc0)
{ //write
vfd_address = spi_data&0x3f;
spi_command = SPI_WRITE_LOW;
}
else
spi_err();
break;
case SPI_READ_LOW:
SPDR = (unsigned char)(dvd_key>>8);
spi_command = SPI_READ_HIGH;
break;
case SPI_READ_HIGH:
spi_command = SPI_WAIT_COMMAND;
dvd_key =0xffff;
asm("CBI 0x17,6");
break;
case SPI_WRITE_LOW:
g_vfd_grid_buffer[vfd_address] = spi_data;
vfd_address++;
spi_command = SPI_WRITE_HIGH;
break;
case SPI_WRITE_HIGH:
g_vfd_grid_buffer[vfd_address] = spi_data;
//if(vfd_address>22)
//for(i=0;i++;i<24)
//g_vfd_grid_buffer[i] = buffer[i];
spi_command = SPI_WAIT_COMMAND;
break;
default:
// Set_FS2(0);
spi_err();
break;
}
//SPCR |=0x80;
}
void spi_err(void)
{
unsigned int delay;
SPCR =00;
SPSR =00;
SEI();
SPDR = 0xff;
asm("CBI 0X17,6");
//dvd_key = 0xffff;
//DI();
delay=50000;
//Set_FS1(0);
while(!(PINB&0x10))
{
if(!delay) break;
soft_delay();
delay--;
}
SPCR = 0xec;
delay =SPDR;
delay=SPSR;
//delay=SPDR;
spi_command = SPI_WAIT_COMMAND;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -