uint8_t cy8c20180_read(uint8_t address) { // request data like described in the datasheet page 9 - one byte of data // BUG: data only reads from chip #0 when both chips are sampled, and turns // up in the space for chip #1 - maybe it takes too long? uint8_t ret = 0x00; // request Register 00h: INPUT_PORT0 i2c_start_wait(address); i2c_write(INPUT_PORT0); i2c_stop(); i2c_start_wait(address); ret = i2c_readNak() << 4; i2c_stop(); // if (address == 0) { ret |= 1 << 4; } // request Register 01h: INPUT_PORT1 i2c_start_wait(address); i2c_write(INPUT_PORT1); i2c_stop(); i2c_start_wait(address); ret |= i2c_readNak(); i2c_stop(); return ret; }
uint8_t I2C_ReadRegister(uint8_t busAddr, uint8_t deviceRegister) { uint8_t data = 0; i2c_start_wait(busAddr+I2C_WRITE); i2c_write(deviceRegister); i2c_start_wait(busAddr+I2C_READ); data = i2c_readNak(); i2c_stop(); return data; }
void ADXL345_init(void) { //Configure the KXPS5 setup registers i2c_start_wait(ADXL345+I2C_WRITE); // set device address and write mode i2c_write(POWER_CTL); i2c_write(POWER_CTL_SET); i2c_stop(); i2c_start_wait(ADXL345+I2C_WRITE); // set device address and write mode i2c_write(DATA_FORMAT); i2c_write(DATA_FORMAT_SET); i2c_stop(); }
/******************************************************************************* * Function: nunchuck_get_data() * Description: Fills the nunchuck_buf array with data from the nunchuck's * registers. The data from this array may be accessed using the get functions ******************************************************************************/ void nunchuck_get_data(void) { i2c_start_wait(NUNCHUCK_ADDR+I2C_WRITE); i2c_write(0x00); i2c_stop(); _delay_ms(10); i2c_start_wait(NUNCHUCK_ADDR+I2C_READ); for (uint8_t i = 0 ; i < 5 ; i++) { nunchuck_buf[i] = nunchuck_decode_byte(i2c_readAck()); } nunchuck_buf[5] = nunchuck_decode_byte(i2c_readNak()); i2c_stop(); }
//Read 8bit data from register with 8bit address void Gyroscope::cmr_read(byte address) { i2c_start_wait( (ADDR << 1) | I2C_WRITE ); // Start / Device address and Write (0) i2c_write(address); // 8bit register address i2c_rep_start( (ADDR << 1) | I2C_READ ); // Repeated Start / Device address and Read (1) res = i2c_readNak(); // Read the result to res i2c_stop(); // End condition }
void mcp4651_setWiper(uint8_t wiper,uint16_t value) { if (wiper>1) return; i2c_start_wait(MCP4651+I2C_WRITE); // set device address and write mode i2c_write(((wiper&0x03)<<4)|((value&0x1FF)>>8)); i2c_write(value&0xFF); i2c_stop(); }
void writeI2Cbyte(uint8_t address, uint8_t location, uint8_t value) { i2c_start_wait(address+I2C_WRITE); // Set up device address i2c_write(location); // Set up register address i2c_write(value); // Write byte i2c_stop(); }
void classic_maj_data(CLASSIC * classic) { u8 i; u8 data[6]; //reset le pointeur de lecture i2c_start(0xa4);//adresse classic en écriture i2c_write(0); i2c_stop(); _delay_us(200);//minimum observé fonctionnel : _delay_us(150); i2c_start_wait(0xa5);//adresse en lecture for(i=0; i<5; i++) { data[i]=i2c_readAck(); } data[5]=i2c_readNak();//le dernier caractère lu ne doit pas avoir d'acknowledge i2c_stop(); /*for(i=0;i<6;i++){ phex(data[i]); print(" "); }*/ classic->bouton1=~data[4]; classic->bouton2=~data[5]; classic->rx=(data[2]>>7)+(data[1]>>(6-1))+(data[0]>>(6-3)); classic->ry=data[2]&0x1f; classic->lx=data[0]&0x3f; classic->ly=data[1]&0x3f; classic->lt=(data[3]>>5)+((data[2]&0x60)>>(5-3)); classic->rt=data[1]&0x3f; }
/******************************************************************************* * Function: nunchuck_init() * Description: initialize the wii nunchuck on the i2c bus by writing the * device address, followed by performing a handshake. ******************************************************************************/ void nunchuck_init(void) { i2c_start_wait(NUNCHUCK_ADDR+I2C_WRITE); // address the nunchuck i2c_write(0x40); // This is a handshake. write 0x00 to address 0x40. i2c_write(0x00); i2c_stop(); }
void _rtc_dev_init( uint8_t address, uint8_t year_offset ) { i2c_start_wait(address+RTC_DEV_WRITE_ADDRESS); // Addresses the RTC i2c_write(0x00); // Set memory address 0x00 i2c_write(RTC_CONFIG_COMMAND); i2c_stop(); }
int main (void) { uint16_t heading; int16_t pitch, roll; uint16_t headingIntegerPart, headingFractionPart; int16_t pitchIntegerPart, pitchFractionPart; int16_t rollIntegerPart, rollFractionPart; // initialize the hardware stuff we use InitTimer (); InitUART (); i2c_init (); fdevopen (UART0_PutCharStdio, UART0_GetCharStdio); // set the LED port for output LED_DDR |= LED_MASK; printf ("\nHoneywell HMC6343 I2C Compass Test\n\n"); // Flash the LED for 1/2 a second... turnOnLED (); ms_spin (500); turnOffLED (); while (1) // outer loop is once every 250 ms (more or less) { // send the HEADING command to the compass i2c_start_wait (COMPASS_ADDRESS_WRITE); i2c_write (COMPASS_HEADING_COMMAND); // now read the response i2c_rep_start (COMPASS_ADDRESS_READ); heading = (i2c_readAck () * 256) + i2c_readAck (); pitch = (i2c_readAck () * 256) + i2c_readAck (); roll = (i2c_readAck () * 256) + i2c_readNak (); i2c_stop (); headingIntegerPart = heading / 10; headingFractionPart = heading - (headingIntegerPart * 10); pitchIntegerPart = pitch / 10; pitchFractionPart = pitch - (pitchIntegerPart * 10); if (pitchFractionPart < 0) pitchFractionPart *= -1; rollIntegerPart = roll / 10; rollFractionPart = roll - (rollIntegerPart * 10); if (rollFractionPart < 0) rollFractionPart *= -1; printf ("Heading: %3d.%1d Pitch: %3d.%1d Roll: %3d.%1d\n", headingIntegerPart, headingFractionPart, pitchIntegerPart, pitchFractionPart, rollIntegerPart, rollFractionPart); turnOnLED (); ms_spin (100); turnOffLED (); ms_spin (150); } // we'll never get here... return 0; }
unsigned char ds1307_setdate(unsigned char year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second) { //sanitize data if (second < 0 || second > 59 || minute < 0 || minute > 59 || hour < 0 || hour > 23 || day < 1 || day > 31 || month < 1 || month > 12 || year < 0 || year > 99) return 8; //sanitize day based on month if(day > pgm_read_byte(ds1307_daysinmonth + month - 1)) return 0; //get day of week unsigned char dayofweek = ds1307_getdayofweek(year, month, day); //write date i2c_start_wait(DS1307_ADDR | I2C_W); i2c_wrt(0x00);//stop oscillator i2c_wrt(ds1307_dec2bcd(second)); i2c_wrt(ds1307_dec2bcd(minute)); i2c_wrt(ds1307_dec2bcd(hour)); i2c_wrt(ds1307_dec2bcd(dayofweek)); i2c_wrt(ds1307_dec2bcd(day)); i2c_wrt(ds1307_dec2bcd(month)); i2c_wrt(ds1307_dec2bcd(year)); i2c_wrt(0x00); //start oscillator i2c_stop(); return 1; }
void rnlcd_readmode_Scancode(void) { i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); i2c_write(27); i2c_write(119); i2c_write(1); i2c_stop(); }
void rnlcd_cursor_state(const uint8_t state) { i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); i2c_write(27); i2c_write(67); i2c_write(state); i2c_stop(); }
void rnlcd_light_state(const uint8_t state) { #ifdef RNLCD_NO_LIGHT i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); i2c_write(27); i2c_write(76); i2c_write(RN_LCD_OFF); i2c_stop(); #else i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); i2c_write(27); i2c_write(76); //i2c_write(state); i2c_write(RN_LCD_OFF); i2c_stop(); #endif }
void _rtc_get_date_dev(Date* tm, uint8_t year_offset, uint8_t addr) { uint8_t c; i2c_start_wait(addr+RTC_DEV_WRITE_ADDRESS); // set device address and write mode i2c_write(0x02); // write memory address = 0x02 i2c_rep_start(addr+RTC_DEV_READ_ADDRESS); // set device address and read mode c = i2c_readAck(); // 0x02 tm->seconds = rtc_bcd_to_binary(c); c = i2c_readAck(); // 0x03 tm->minutes = rtc_bcd_to_binary(c); // Throw away AMPM information i2c_readAck(); // 0x04 c = i2c_readAck(); // 0x05 tm->day = rtc_bcd_to_binary(c & 0x3F); tm->year = ((rtc_bcd_to_binary(c) >> 6) & 0x3) + 1970 + year_offset; c = i2c_readNak(); // 0x06: don't acknowledge the last byte // Throw away day of week information //tm->dayOfWeek = ((c >> 5) & 0x7); tm->month = (c & 0x1F); i2c_stop(); // stop i2c bus }
void _rtc_setCounting_dev(uint8_t count, uint8_t addr) { i2c_start_wait(addr+RTC_DEV_WRITE_ADDRESS); // Addresses the RTC i2c_write(0x00); // Set memory address 0x00 i2c_write(RTC_CONFIG_COMMAND | (((count == 0) & 0x1)<<7)); i2c_stop(); }
void writePage64(unsigned char *dataArray) { /*unsigned int i=0; unsigned char ret = 0; unsigned int increment = 0; unsigned int arrayLenght = sizeof(dataArray); char iterationAmount = arrayLenght/64; metka: i2c_init(); for(i=0;i<iterationAmount;i++){ ret = i2c_start(Dev24C02+I2C_WRITE); if(ret!=0){ i2c_write((i*64)>>8); //HSB i2c_write(i*64); //LSB while(increment++<64){ i2c_write(dataArray[increment]); } i2c_stop(); } else{ goto metka; } */ i2c_init(); // initialize I2C library // write 0x75 to EEPROM address 5 (Byte Write) i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode i2c_write(0x05); // write address = 5 i2c_write(0x75); // write value 0x75 to EEPROM i2c_stop(); }
void rnlcd_readmode_ASCII(void) { i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); i2c_write(27); i2c_write(119); i2c_write(0); i2c_stop(); }
void ds1307_enable_sq(uint8_t setting) { i2c_start_wait(DS1307_ADDR | I2C_WRITE); i2c_write(0x07);//set register pointer to sq register i2c_write(setting); i2c_stop(); }
void lis302_write_register(uint8_t register_address, uint8_t value) { i2c_start_wait(I2C_7BIT_WRITE(LIS302_I2C_ADDRESS)); i2c_write(register_address); i2c_write(value); i2c_stop(); }
void rnlcd_setxy(const uint8_t x, const uint8_t y) { i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); i2c_write(27); i2c_write(79); i2c_write(x); i2c_write(y); i2c_stop(); }
unsigned char getTemp() { i2c_init(); i2c_start_wait(TC74Address + I2C_WRITE); i2c_write(0x00); i2c_rep_start(TC74Address + I2C_READ); char temp = i2c_readNak(); i2c_stop(); return temp; }
uint8_t rtc_read(unsigned char addr) { uint8_t ret; i2c_start_wait(DevRTC); // set device address and write mode i2c_write(addr); // write address = 0 i2c_rep_start(DevRTC+1); // set device address and read mode ret = i2c_readNak(); // read one byte form address 0 i2c_stop(); // set stop condition = release bus return ret; }
int16_t MPU6050_signed_readreg(uint8_t accel, uint8_t reg)//read signed 16 bits { i2c_start_wait(accel+I2C_WRITE); // set device address and write mode i2c_write(reg); // ACCEL_OUT i2c_rep_start(accel+I2C_READ); // set device address and read mode char raw1 = i2c_readAck(); // read one intermediate byte int16_t raw2 = (raw1<<8) | i2c_readNak(); // read last byte i2c_stop(); return raw2; }
//Given a 8-bit number from EEPROM (Slave address 0x50), write value to MLX sensor (Slave address 0x60) void writeTrimmingValue(byte val) { i2c_start_wait(MLX90620_WRITE); //Write to the sensor i2c_write(0x04); //Command = write oscillator trimming value i2c_write((byte)val - 0xAA); i2c_write(val); i2c_write(0x56); //Always 0x56 i2c_write(0x00); //Always 0x00 i2c_stop(); }
uint8_t lis302_read_register(uint8_t register_address) { uint8_t result = -1; i2c_start_wait(I2C_7BIT_WRITE(LIS302_I2C_ADDRESS)); i2c_write(register_address); i2c_rep_start(I2C_7BIT_READ(LIS302_I2C_ADDRESS)); result = i2c_readNak(); i2c_stop(); return result; }
void rnlcd_putc_times(const char c, const uint8_t times) { i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); for(uint8_t i=0; i<times; i++) { i2c_write(c); #ifdef RN_USE_DELAY __RN_LCD_DO_DELAY(); #endif } i2c_stop(); }
void rnlcd_puts_l_P(PGM_P str, const uint8_t len) { i2c_start_wait(RN_LCD_ADDR + I2C_WRITE); for(uint8_t i=0; i<len; i++) { i2c_write(pgm_read_byte(str+i)); #ifdef RN_USE_DELAY __RN_LCD_DO_DELAY(); #endif } i2c_stop(); }
int twi_read_byte(uint8_t addr, uint8_t reg, uint8_t* target){ i2c_start_wait(addr << 1); if(i2c_write(reg)){ return 1; } if(i2c_rep_start((addr << 1) + 1)){ return 1; } *target = i2c_readNak(); i2c_stop(); return 0; }