📄 spi.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 + -