📄 spi_at.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 4000000UL
#include <avr/delay.h>
#define uchar8 unsigned char
const uchar8 LedNum[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar8 ShowNum[4] = {0,0,0,0}; // 十六进制的显示4位
void delay()
{
int i;
for(i=0;i<600;i++)
;
}
void LEDHexShow()
{
uchar8 i,tmp,curnum;
tmp = 0xef;
for(i=0;i<4;i++)
{
PORTA = tmp;
PORTC = LedNum[ShowNum[i]];
delay();
tmp = (tmp << 1) + 0x1;
}
}
unsigned char spi_transfer(unsigned char data)
{
unsigned char temp;
SPDR = data;
while(!(SPSR & (1<<SPIF)))
{
asm("nop");
}
temp = SPDR;
return temp;
}
// 读取AT25F1024的厂家ID和设备ID
unsigned int SPI_ReceiveID(void)
{
unsigned char data[2];
unsigned int outdata;
/* Enable SPI Interface */
PORTB = PORTB & 0xef; /* Enable AT25F512 Chip Select (L) */
spi_transfer(0x15); /* transmit the SECTOR_ERASE op_code */
/* receive the manufacturing code */
data[0] = spi_transfer(0xff); /* receive the ID code */
data[1] = spi_transfer(0xff);
PORTB = PORTB | 0x10; /* Disable AT25F512A Chip Select (H) */
outdata = data[0];
outdata = outdata<<8;
outdata = outdata + data[1];
return outdata;
}
int main(void)
{
unsigned char temp;
unsigned int data;
unsigned char i;
DDRC = 0xff;
DDRA = 0xff;
DDRD = 0; // 输入方式
_delay_ms(100);
DDRB|=(1<<4); /* SS端设置为输出 */
DDRB|=(1<<5); /* MOSI端口设置为输出 */
DDRB&=~(1<<6); /* MISO端口设置为输入 */
DDRB|=(1<<7); /* SCK端口设置为输出 */
SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); /* SPI ENABLE,MASTER MODE,Fsoc/16 */
PORTB|=(1<<4);
temp = SPSR;
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
while(1)
{
LEDHexShow();
data = SPI_ReceiveID();
for(i=0;i<4;i++)
{
ShowNum[i] = data%16;
data = data/16;
}
delay();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -