⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_at.c

📁 AVR典型实例.rar
💻 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 + -