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

📄 softspi.c

📁 Use optical mouse sensor from Logitech Mouse with an Atmel AVR controller Documentation in german
💻 C
字号:
//#########################################################################
// softspi.c
//
// Software SPI for Optical Mouse Sensor ADNS-2610
//
//#########################################################################
// Last change: 09.02.2008
//#########################################################################
// hk@holger-klabunde.de
// http://www.holger-klabunde.de/index.html
//#########################################################################
// Compiler: AVR-GCC 4.1.1
//#########################################################################
#include <avr/io.h>
#include <util/delay.h>
#include "softspi.h"

#define SPI_DELAY	1

//###################################################################################
unsigned char ADNSRead(unsigned char adr)
//###################################################################################
{
 unsigned char temp;
 
 soft_spi_write(adr);
 Delay1us(120);
 
 temp=soft_spi_read();
 Delay1us(120);

 return temp;
}

//###################################################################################
void ADNSWrite(unsigned char adr, unsigned char data)
//###################################################################################
{
 soft_spi_write(adr | 0x80);
 Delay1us(120);
 soft_spi_write(data);
 Delay1us(120);
}

//###################################################################################
void Delay1ms(unsigned int time)
//###################################################################################
{
 while(time--) _delay_ms(1);
}

//###################################################################################
void Delay1us(unsigned int time)
//###################################################################################
{
 while(time--) _delay_us(1);
}

//###################################################################################
void soft_spi_init(void)
//###################################################################################
{
 unsigned char i,temp;
 
 SOFT_SPI_DDR |= (1<<SOFT_SPI_SCK) | (1<<SOFT_SPI_OUT);

//Set SCK High
 SOFT_SPI_PORT |= (1<<SOFT_SPI_SCK) | (1<<SOFT_SPI_OUT);

 Delay1ms(500); // Wait for Power up 

// soft_spi_write(0xFF);
// Delay1ms(500); // Wait for ADNS timeout 

 for(i=0; i<64; i++) // Try to sync to ADNS
  {
   temp = ADNSRead(ADNS_STATUS);
   if((temp & 0xE0) != 0)
    {
     cbi(SOFT_SPI_PORT,SOFT_SPI_SCK);
     Delay1us(SPI_DELAY);
     sbi(SOFT_SPI_PORT,SOFT_SPI_SCK);
     Delay1us(SPI_DELAY);

     Delay1ms(150); // Wait for ADNS timeout 
    }
     
  }
}

//###################################################################################
void soft_spi_write(unsigned char data)
//###################################################################################
{
 unsigned char i,mask;

 mask=0x80; // begin with MSB

// sbi(SOFT_SPI_DDR,SOFT_SPI_OUT);
 
 for(i=0; i<8; i++)
  {
   cbi(SOFT_SPI_PORT,SOFT_SPI_SCK);
   Delay1us(SPI_DELAY);

   if(data & mask) sbi(SOFT_SPI_PORT,SOFT_SPI_OUT);
   else            cbi(SOFT_SPI_PORT,SOFT_SPI_OUT);
   Delay1us(SPI_DELAY);

   sbi(SOFT_SPI_PORT,SOFT_SPI_SCK);
   Delay1us(SPI_DELAY);

   mask >>= 1;
  }

// cbi(SOFT_SPI_DDR,SOFT_SPI_OUT); // go to hi-z
 Delay1us(1);
}

//###################################################################################
unsigned char soft_spi_read(void)
//###################################################################################
{
 unsigned char i,mask,result;
 
 result=0;
 sbi(SOFT_SPI_PORT,SOFT_SPI_OUT); // Pullup Data Line

 mask=0x80; // begin with MSB

 for(i=0; i<8; i++)
  {
   cbi(SOFT_SPI_PORT,SOFT_SPI_SCK);
   Delay1us(SPI_DELAY);
   sbi(SOFT_SPI_PORT,SOFT_SPI_SCK);
   Delay1us(SPI_DELAY);

   if( bit_is_set(SOFT_SPI_PIN,SOFT_SPI_IN) ) result |= mask;
   
   mask >>= 1;
  }

 Delay1us(1);

 return result;
}

⌨️ 快捷键说明

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