// Copyright 2007-2008 Xo W. // Adapted from http://www.windmeadow.com/node/42 // Thanks to Chad for the great work! #include #include "nunchuk.h" #include "i2c/i2c.h" #include "delay/delay.h" unsigned char i; void init_nunchuk (char* buf) { OpenI2C(MASTER, SLEW_OFF); SSPADD = 39; // 300 kHz DelayMs(20); // 20 ms StartI2C(); IdleI2C(); WriteI2C(0xA4); // Slave address: 0x52, write mode IdleI2C(); WriteI2C(0x40); // Memory address IdleI2C(); WriteI2C(0x00); // Zero IdleI2C(); StopI2C(); DelayBigUs(998); // Delay 1 ms StartI2C(); IdleI2C(); WriteI2C(0xA5); // Slave address: 0x52, read mode for(i = 0; i < (unsigned char)6; i++) { IdleI2C(); buf[i] = ReadI2C(); if (i < (unsigned char)6) AckI2C(); } NotAckI2C(); IdleI2C(); StopI2C(); DelayUs(27); } void read_nunchuk (char* buf) { StartI2C(); IdleI2C(); WriteI2C(0xA4); // Slave address: 0x52, write mode IdleI2C(); WriteI2C(0x00); // Zero IdleI2C(); StopI2C(); DelayUs(158); StartI2C(); IdleI2C(); WriteI2C(0xA5); // Slave address: 0x52, read mode for(i = 0; i < (unsigned char)6; i++) { IdleI2C(); buf[i] = ReadI2C(); if (i < (unsigned char)6) AckI2C(); } NotAckI2C(); IdleI2C(); StopI2C(); }