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