예제 #1
0
// send a number of bytes to the rtc over i2c
// returns true to indicate success
static bool ICACHE_FLASH_ATTR ds1307_send(uint8 *data, uint8 len) {

	int loop;

	// signal i2c start
	i2c_master_start();

	// write address & direction
	i2c_master_writeByte((uint8)(DS1307_ADDR << 1));
	if (!i2c_master_checkAck()) {
		//uart0_send("i2c error1\r\n");
		i2c_master_stop();
		return false;
	}

	// send the data
	for (loop = 0; loop < len; loop++) {
		i2c_master_writeByte(data[loop]);
		if (!i2c_master_checkAck()) {
			//uart0_send("i2c error2\r\n");
			i2c_master_stop();
			return false;
		}
	}

	// signal i2c stop
	i2c_master_stop();

	return true;

}
static bool ICACHE_FLASH_ATTR singleByteWrite(uint8_t adr, uint8_t reg, uint8_t data){
	i2c_master_start();

	i2c_master_writeByte((uint8_t)(adr << 1));
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	i2c_master_writeByte(reg);
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}
	
	i2c_master_writeByte(data);
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	i2c_master_stop();

	return true;
}
예제 #3
0
파일: at24c.c 프로젝트: MrZANE42/esp8266
// set the current data address, this is the start of the write command
// next either send the data to be written, or start a read instead
// returns true to indicate success
static bool ICACHE_FLASH_ATTR at24c_setAddr(uint16 addr) {

	uint8 loop;
	uint8 data[2];

	// signal i2c start
	i2c_master_start();

	// write i2c address & direction
	i2c_master_writeByte((uint8)(AT24C_ADDR << 1));
	if (!i2c_master_checkAck()) {
		//uart0_send("i2c error\r\n");
		i2c_master_stop();
		return false;
	}

	// write data address
	data[0] = (uint8)(((unsigned)addr) >> 8);
	data[1] = (uint8)(((unsigned)addr) & 0xff);
	for (loop = 0; loop < 2; loop++) {
		i2c_master_writeByte(data[loop]);
		if (!i2c_master_checkAck()) {
			//uart0_send("i2c error\r\n");
			i2c_master_stop();
			return false;
		}
	}

	return true;
}
예제 #4
0
bool i2c_master_writeBytes(uint8 address, uint8 *values, uint8 length)
{
	i2c_master_start();

	i2c_master_writeByte(address);
	if (!i2c_master_checkAck())
	{
		i2c_master_stop();
#ifdef CONFIG_I2C_MASTER_DEBUG
		console_printf( "Device not ACKed on address\n" );
#endif
		return false;
	}

	for(uint8 i = 0; i < length; i++){

		i2c_master_writeByte(values[i]);
		if (!i2c_master_checkAck())
		{
#ifdef CONFIG_I2C_MASTER_DEBUG
			console_printf( "Device not ACKed on write\n" );
#endif
			i2c_master_stop();
			return false;
		}
	}

	i2c_master_stop();
	return true;
}
예제 #5
0
/************ low level data pushing commands **********/
void LCD_expanderWrite(uint8 _data){                                        
    i2c_master_start();
    i2c_master_writeByte(LCD_ADDRESS << 1);
    if (!i2c_master_checkAck()) 
    {
        i2c_master_stop();
        return;
    }
    //i2c_master_writeByte((uint8)(_data) | _backlightval);
    i2c_master_writeByte((uint8)(_data) | LCD_BACKLIGHT);
    i2c_master_checkAck();
    i2c_master_stop();
}
예제 #6
0
// read a number of bytes from the rtc over i2c
// returns true to indicate success
static bool ICACHE_FLASH_ATTR ds1307_recv(uint8 *data, uint8 len) {
	
	int loop;

	// signal i2c start
	i2c_master_start();

	// write address & direction
	i2c_master_writeByte((uint8)((DS1307_ADDR << 1) | 1));
	if (!i2c_master_checkAck()) {
		//uart0_send("i2c error3\r\n");
		i2c_master_stop();
		return false;
	}

	// read bytes
	for (loop = 0; loop < len; loop++) {
		data[loop] = i2c_master_readByte();
		// send ack (except after last byte, then we send nack)
		if (loop < (len - 1)) i2c_master_send_ack(); else i2c_master_send_nack();
	}

	// signal i2c stop
	i2c_master_stop();

	return true;

}
예제 #7
0
파일: at24c.c 프로젝트: MrZANE42/esp8266
// wait for a write operation to complete
// by 'acknowledge polling'
void ICACHE_FLASH_ATTR at24c_writeWait() {
	do {
		i2c_master_start();
		i2c_master_writeByte((uint8)((AT24C_ADDR << 1) | 1));
	} while (!i2c_master_checkAck());
	i2c_master_stop();
}
예제 #8
0
파일: at24c.c 프로젝트: MrZANE42/esp8266
// write within a page
// note if you try to write past a page boundary the write will
// wrap back to the start of the same page, so you need to know
// how much you're writing and where you're writing it to
// you don't need to start writing at the start of a page, but if you
// start in the middle you'll be able to write less before wrapping
// optionally wait for the eeprom to complete the write
// returns true to indicate success
bool ICACHE_FLASH_ATTR at24c_writeInPage(uint16 addr, uint8* data, uint8 len, bool wait) {

	int loop;

	// set data address (includes i2c setup,
	// so no need to call i2c_master_start here)
	if (!at24c_setAddr(addr)) return false;

	// send the data
	for (loop = 0; loop < len; loop++) {
		i2c_master_writeByte(data[loop]);
		if (!i2c_master_checkAck()) {
			//uart0_send("i2c error\r\n");
			i2c_master_stop();
			return false;
		}
	}

	// signal i2c stop
	i2c_master_stop();

	// optionally, wait until the eeprom signals the write is finished
	if (wait) at24c_writeWait();

	return true;
}
static bool ICACHE_FLASH_ATTR commandOnlyWrite(uint8_t adr, uint8_t reg){
	i2c_master_start();

	i2c_master_writeByte((uint8_t)(adr << 1));
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	i2c_master_writeByte(reg);
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	i2c_master_stop();

	return true;
}
static bool ICACHE_FLASH_ATTR byteRead(uint8_t adr, uint8_t reg, uint8_t data[], uint8_t length){
	uint8_t i;

	i2c_master_start();

	i2c_master_writeByte((uint8_t)(adr << 1));
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	i2c_master_writeByte(reg);
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	i2c_master_start();

	i2c_master_writeByte((uint8_t)((adr << 1) | 1));
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	for(i = 0; i < length-1; i++){
		data[i] = i2c_master_readByte();
		i2c_master_send_ack();	
	}

	data[i] = i2c_master_readByte();
	
	i2c_master_send_nack();
	i2c_master_stop();

	return true;
}
예제 #11
0
bool i2c_master_readBytes(uint8 address, uint8 *values, uint8 length)
{
	if(values[0] > 0){
		if(!i2c_master_writeBytes(address, values, 1)){
			return false;
		}
	}

	uint8 timeout = 100;
	do{
		i2c_master_start();
		i2c_master_writeByte(address+1);
		if(!i2c_master_checkAck()){
			i2c_master_stop();
			i2c_master_wait(1000);
			continue;
		}
		break;
	}while(--timeout>0);

	if(timeout == 0){
		return false;
	}

#ifdef CONFIG_I2C_MASTER_DEBUG
	console_printf("Read: ");
#endif
	uint8 readed = 0;
	while((readed < length) && (--timeout>0)){
		uint8 byte = i2c_master_readByte();
		values[readed++] = byte;
		i2c_master_setAck((readed == length));	// send the ACK or NAK as applicable
		i2c_master_setDC(1, 0); // release SDA
#ifdef CONFIG_I2C_MASTER_DEBUG
		console_printf("%d ", byte);
#endif
	}
#ifdef CONFIG_I2C_MASTER_DEBUG
	console_printf("\n");
#endif
	i2c_master_stop();
	return true;
}
예제 #12
0
/* Wrote a simple I2C bus scanner to find connected i2C devices */
void i2c_bus_scan()
{
    int index = 0;
    uint8_t result;

    os_printf("Scanning I2C bus for devices\r\n");
    for (index=1; index <=127; index ++)
    {
        i2c_master_start();                     // Start I2C request

        i2c_master_writeByte(index<<1| 0b00000001);     //DS1307 address + W
        result = i2c_master_checkAck();

        if (result)
        {
            os_printf("\tI2C device present at 0x%x\r\n", index);
        }

        i2c_master_stop();
    }

}
예제 #13
0
uint8 LCD_init(){

    i2c_master_start();
    i2c_master_writeByte(LCD_ADDRESS << 1);
    if (!i2c_master_checkAck()) {
        i2c_master_stop();
        return 0;
    }
    i2c_master_stop();

    _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;

    if (LCD_ROW > 1) {
        _displayfunction |= LCD_2LINE;
    }
    _numlines = LCD_ROW;

    // for some 1 line displays you can select a 10 pixel high font
    if ((LCD_DOTSIZE != 0) && (LCD_ROW == 1)) {
        _displayfunction |= LCD_5x10DOTS;
    }

    // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
    // according to datasheet, we need at least 40ms after power rises above 2.7V
    // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
    os_delay_us(50000); 
  
    // Now we pull both RS and R/W low to begin commands
    LCD_expanderWrite(0);   // reset expanderand turn backlight off
    os_delay_us(1000000);

    //put the LCD into 4 bit mode
    // this is according to the hitachi HD44780 datasheet
    // figure 24, pg 46
    
    // we start in 8bit mode, try to set 4 bit mode
    LCD_write4bits(0x30);
    os_delay_us(4500); // wait min 4.1ms
    
    // second try
    LCD_write4bits(0x30);
    os_delay_us(4500); // wait min 4.1ms
    
    // third go!
    LCD_write4bits(0x30); 
    os_delay_us(150);
    
    // finally, set to 4-bit interface
    LCD_write4bits(0x20); 


    // set # lines, font size, etc.
    LCD_command(LCD_FUNCTIONSET | _displayfunction);  
    
    // turn the display on with no cursor or blinking default
    _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
    LCD_display();
    
    // clear it off
    LCD_clear();
    
    // Initialize to default text direction (for roman languages)
    _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
    
    // set the entry mode
    LCD_command(LCD_ENTRYMODESET | _displaymode);
    
    LCD_home();

    return 1;
}