C语言程序>>SPI

来源:互联网 发布:双端面磨床 知乎 编辑:程序博客网 时间:2024/05/29 19:08
 #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
}
#ifndef _SPI_
#define _SPI_

void init_SPI(void);
char spi_rw(char wdata);
void un_init_SPI(void);

#endif

原创粉丝点击