CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Avago ADNS 7550 Laser mouse sensor driver

 
Post new topic   Reply to topic    CCS Forum Index -> Code Library
View previous topic :: View next topic  
Author Message
mohammad3d



Joined: 28 Mar 2009
Posts: 17

View user's profile Send private message Send e-mail

Avago ADNS 7550 Laser mouse sensor driver
PostPosted: Tue Oct 16, 2018 6:42 am     Reply with quote

Hi everyone,

I try to read an Avago ADNS-7550 laser mouse sensor with dsPic micro and
finally Do this...
I share my experience with all of you and I hope this useful for your projects.

Regards,
Mohammad Kouchekzadeh.

Source :
Code:

// This program drive and read Data from Avago ADNS-7550 laser mouse sensor
// via 4 wire SPI protocol
// PIC is master device and Avago ADNS-7550 is slave device
// You can find more detail in avago AV02-0685EN.pdf file
// program by Mohammad Kouchekzadeh
// E-mail [email protected]

#include <30F6014A.h>

#fuses XT,NOWDT

#use delay(clock=10000000)
#use rs232(baud=38400,UART2,parity=N,bits=8,TIMEOUT=20)

#use standard_io(F)
#use standard_io(G)

#define Clock_pin PIN_F6 //-->connect to ADNS-7550 pin 5
#define Data_in_pin PIN_F7 //-->connect to ADNS-7550 pin 4
#define Data_out_pin PIN_F8 //-->connect to ADNS-7550 pin 6
#define NCS PIN_G3 //-->connect to ADNS-7550 pin 3 Chipselect active low
/*
////////// read data from Master device /////////////////////
unsigned int8 read_data_slave_mode(void)
{
 unsigned int8 DATA;
 signed int8 i = 8;
  while(input(PIN_G2)==1);
    for(i=7;i!=-1;i--)  {
          while(input(Clock_pin)==1);//wait for falling edge
          while(input(Clock_pin)==0);//wait for rising edge                           
         if(input( Data_in_pin))
            bit_set(DATA,i);
           else
             bit_clear(DATA,i);                       
       }         
    return(DATA);
}
*/
void writeRegister(unsigned int8 DATA)
{
        int1  SPI_DATA=0;       
        signed int8 clock_pulse=0;       
        delay_us(300);       
        for(clock_pulse=7;clock_pulse!=-1;clock_pulse--)
           {
            output_bit(Clock_pin,0);
            delay_us(70);           
            SPI_DATA=DATA>>clock_pulse;
            output_bit(Data_out_pin,SPI_DATA);
            delay_us(30);
            output_bit(Clock_pin,1);
            delay_us(100);                       
        }
       output_bit(Data_out_pin,1);
}     
unsigned int8 readRegister(void)
{
 unsigned int8 DATA;
 signed int8 i = 8;
   delay_us(300);     
    for(i=7;i!=-1;i--)  {
         output_bit(Clock_pin,0);
         delay_us(100);           
         output_bit(Clock_pin,1);
         delay_us(30);         
         if(input(Data_in_pin))
            bit_set(DATA,i);
           else
             bit_clear(DATA,i);
         delay_us(70);         
       }   
    output_bit(Clock_pin,1);
    return(DATA);
}

void main()
{
int8 i=0,j=1;
unsigned int8 data[50];
delay_ms(500);
/////////// Start ADNS-7550 power up sequence /////////////////

///// Drive NCS high, then low to reset the SPI port //////////
output_bit(NCS,1);
delay_ms(1);
output_bit(NCS,0);
delay_ms(1);
output_bit(NCS,1);
delay_ms(1);
output_bit(NCS,0);

//Note:in write operation The first byte contains the address (seven bits) and
//     has a “1” as its MSB to indicate data direction : 0x3A->0xBA
//Note:in read operation address MSB bit is '0': 0x3A->0x3A

//Write 0x5a to register 0x3a
writeRegister(0xBA);
writeRegister(0x5A);
//Wait for at least one frame
delay_us(1350);//wait
//Clear observation register
writeRegister(0xAE);
writeRegister (0x00);
//Wait for at least one frame
delay_us(1350);
//Wait at least one frame and check observation
//register, all bits 0-3 must be set.
writeRegister(0x2E);
data[i++]=readRegister();
//Read from registers 0x02, 0x03, 0x04 and 0x05 (or
//read these same 4 bytes from burst motion register
//0x42) one time regardless of the motion pin state
writeRegister(0x02);
data[i++]=readRegister();
writeRegister(0x03);
data[i++]=readRegister();
writeRegister(0x04);
data[i++]=readRegister();
writeRegister(0x05);
data[i++]=readRegister();
//Write 0x27 to register 0x3C
writeRegister(0xBC);
writeRegister(0x27);
//Write 0x0a to register 0x22
writeRegister(0xA2);
writeRegister(0x0A);
//Write 0x01 to register 0x21
writeRegister(0xA1);
writeRegister(0x01);
//Write 0x32 to register 0x3C
writeRegister(0xBC);
writeRegister(0x32);
//Write 0x20 to register 0x23
writeRegister(0xA3);
writeRegister(0x20);
//Write 0x05 to register 0x3C
writeRegister(0xBC);
writeRegister(0x05);
//Write 0xB9 to register 0x37
writeRegister(0xB7);
writeRegister(0xB9);
//write dummy data
writeRegister(0x00);
writeRegister(0xFF);
//Set LASER_CTRL0 register
writeRegister(0x9A);
writeRegister(0xC0);
//Set LASER_CTRL1 register
writeRegister(0x9F);
writeRegister(0x00);
//Set LSRPWR_CFG0 register
writeRegister(0x9C);
writeRegister(0xDD);
//Set LSRPWR_CFG1 register
writeRegister(0x9D);
writeRegister(0x22);
//write dummy data
writeRegister(0x00);
writeRegister(0xFF);
//Set Configuration2_Bits register
writeRegister(0x92);
writeRegister(0x06);
//Read Inverse_Revision_ID register(Must be 0xfc)
writeRegister(0x3E);
data[i++]=readRegister();
//Read Inverse_Product_ID register(Must be 0xcd)
writeRegister(0x3F);
data[i++]=readRegister();

output_bit(NCS,1);
/*
for(j=0;j<i;j++)
{
putc(data[j]);
}
*/
for(;;)
{
output_bit(NCS,0);
//// Read Delta_X_L register
writeRegister(0x03);
data[0]=readRegister();
//// Read Delta_Y_L register
writeRegister(0x04);
data[1]=readRegister();
output_bit(NCS,1);
delay_ms(20);
if(data[0]!=0)
putc(data[0]);
//putc(data[1]);
}
 
}
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> Code Library All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group