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

📄 spi.c

📁 AVR单片机c语言的开发板程序
💻 C
字号:
#include <avr/io.h>

#define _V_SPI_

#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define SPI_PIN PINB
#define DS1302_MOSI			5		//PB5 MOSI要串10K电阻到MISO,然后把MISO跟DS1302_IO脚短接在一起的
#define DS1302_MISO			6		//PB6 MISO跟DS1302_IO脚短接在一起的---DS1302 pin6
#define DS1302_SCK			7		//PB7 SCK----DS1302 pin7

//初始化SPI接口
void init_SPI(void)
{
	SPI_PORT |= (1<<PB4);
	SPI_PORT &= ~(1<<DS1302_SCK)&~(1<<DS1302_MOSI)&~(1<<DS1302_MISO);
    SPI_DDR |=(1<<PB4)|(1<<DS1302_SCK)|(1<<DS1302_MOSI);
    SPI_DDR &=~(1<<DS1302_MISO);

    #ifndef _V_SPI_
	SPCR = (1<<SPE)|(1<<MSTR)|(1<<DORD)|(1<<SPR1)|(1<<SPR0);		
    // 使能SPI接口,主机模式,LSB低位在先,模式0,16分频,SPI时钟约1MHz
	#endif
}

void un_init_SPI(void)
{
    SPI_DDR |=(1<<DS1302_MISO);
}

char spi_rw(char wdata)
{
    #ifndef _V_SPI_
	SPDR = wdata;// 传送数据到SPI寄存器
    loop_until_bit_is_set(SPSR,SPIF);// 等待数据传送完?
    return(SPDR);// 读取数据
	#else
	char rdata = 0;
	char i = 0;

	for(i = 0;i < 8;i ++)
	{
		SPI_PORT &= ~(1 << DS1302_SCK);//时钟拉低

		if(wdata & 0x01)
		{
			SPI_PORT |= (1 << DS1302_MOSI);
		}
		else
		{
			SPI_PORT &= ~(1 << DS1302_MOSI);
		}
		wdata >>= 1;//右移一位

		rdata >>= 1;//右移一位
		if(SPI_PIN & (1 << DS1302_MISO))
		{
			rdata |= 0x80;
		}
		
		SPI_PORT |= (1 << DS1302_SCK);//时钟拉高,产生上升沿
	}
	SPI_PORT &= ~(1 << DS1302_SCK);//时钟拉低
    return(rdata);// 读取数据

	#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -