Пример #1
0
/** Reset the FIFO.
 * This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This
 * bit automatically clears to 0 after the reset has been triggered.
 * @see MPU6050_RA_USER_CTRL
 * @see MPU6050_USERCTRL_FIFO_RESET_BIT
 */
uint8_t MPU6050::resetFIFO() {
  buffer[0] = MPU6050_RA_USER_CTRL;
  if (twi_writeTo(devAddr, buffer, 1, true)) return 0xFF;
  if (twi_readFrom(devAddr, buffer+1, 1) != 1) return 0xFF;
  buffer[1] |= (1 << MPU6050_USERCTRL_FIFO_RESET_BIT);
  if (twi_writeTo(devAddr, buffer, 2, true)) return 0xFF;
  return 0;
}
Пример #2
0
/*
 * Function ScI2cMxScrollingHorizontal
 * Desc     ZT.SC-I2CMx Scrolling Horizontal
 * Input    addr:ZT.SC-I2CMx Address
            lr: Scroll direction
            spage: start page
            epage: end page
            frames: Scroll fram
 * Output   0 .. success
 *          1 .. length to long for buffer
 *          2 .. address send, NACK received
 *          3 .. data send, NACK received
 *          4 .. other twi error (lost bus arbitration, bus error, ..)
 */
int ZtLib::ScI2cMxScrollingHorizontal(uint8_t addr, uint8_t lr, uint8_t spage, uint8_t epage,uint8_t frames)
{
    uint8_t buff[9] = {REG_CMD, 0x2E, 0x00, spage, frames, epage, 0x00, 0xFF, 0x2F};
    twi_writeTo(addr, buff, 2, 1, 1);
    buff[0] = REG_CMD;
    buff[1] = lr;
    for (int i=0; i<10; i++);
    return twi_writeTo(addr, buff, 9, 1, 1);
}
Пример #3
0
//
//	Originally, 'endTransmission' was an f(void) function.
//	It has been modified to take one parameter indicating
//	whether or not a STOP should be performed on the bus.
//	Calling endTransmission(false) allows a sketch to 
//	perform a repeated start. 
//
//	WARNING: Nothing in the library keeps track of whether
//	the bus tenure has been properly ended with a STOP. It
//	is very possible to leave the bus in a hung state if
//	no call to endTransmission(true) is made. Some I2C
//	devices will behave oddly if they do not see a STOP.
//
uint8_t TwoWireMaster::endTransmission(uint8_t sendStop)
{
#if ORG_FILE
  // transmit buffer (blocking)
  int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop);
#else  // ORG_FILE
  bool s = twiMstrTransfer((txAddress << 1) | I2C_WRITE, txBuffer,
                           txBufferLength, sendStop ? I2C_STOP : I2C_REP_START);
   int8_t ret = 0;
   if (!s) {
     if (twiMstrFailureState() == TWI_MTX_ADR_NACK) {
       ret = 2;
     }else if (twiMstrFailureState() == TWI_MTX_DATA_NACK) {
       ret = 3;
     } else {
       ret = 4;
     }
   }
#endif  // ORG_FILE
  // reset tx buffer iterator vars
  txBufferIndex = 0;
  txBufferLength = 0;
  // indicate that we are done transmitting
  transmitting = 0;
  return ret;
}
// Helper function to write to the accelerometer and interpret the error code, if any
void GadgetShield::twiWrite(const void *buf, uint8_t length)
{
  uint8_t code;

  code = twi_writeTo(ACC_SLAVE_ADDR, (uint8_t *)buf, length, 1);
  errorWrite(code);
}
Пример #5
0
/*
 * Function Seg8b4a036aDisplayDec
 * Desc     ZT.SEG8B4A036A Display decimal numeral
 * Input    addr:ZT.SEG8B4A036A Address
            val: Display Val
            bitnum:Display Bit Number
            dotbit: Dot Display
 * Output   0 .. success
 *          1 .. length to long for buffer
 *          2 .. address send, NACK received
 *          3 .. data send, NACK received
 *          4 .. other twi error (lost bus arbitration, bus error, ..)
 */
int ZtLib::Seg8b4a036aDisplayDec(uint8_t addr,unsigned short val, uint8_t bitnum, uint8_t dotbit)
{
  uint8_t i;
  uint8_t segnum[5];
  if (val>9999) return 0xFF;

  segnum[0] = REG_DAT;
  segnum[1] = val%10;
  segnum[2] = (val%100)/10;
  segnum[3] = (val/100)%10;
  segnum[4] = val/1000;
  for (i=1; i<5; i++)
  {
      segnum[i] = codetable[segnum[i]];
      if (dotbit&0x01)
      {
          segnum[i] |= 0x80;
      }
      dotbit >>= 1;
  }

  if (bitnum==DISP_0BIT)      {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;segnum[1] = 0;}
  else if (bitnum==DISP_1BIT) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;}
  else if (bitnum==DISP_2BIT) {segnum[4] = 0;segnum[3] = 0;}
  else if (bitnum==DISP_3BIT) {segnum[4] = 0;}
  else if (bitnum==DISP_AUTO)
  {
     if (val<10)        {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;}
     else if (val<100)  {segnum[4] = 0;segnum[3] = 0;}
     else if (val<1000) {segnum[4] = 0;}
  }

  return twi_writeTo(addr, segnum, 5, 1, 1);
}
Пример #6
0
uint8_t TwoWire::endTransmission(uint8_t sendStop){
  int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, sendStop);
  txBufferIndex = 0;
  txBufferLength = 0;
  transmitting = 0;
  return ret;
}
Пример #7
0
/*
 * Function Seg8b4a036aDisplayHex
 * Desc     Read ZT.SEG8B4A036A Display hexadecimal number
 * Input    addr:ZT.SEG8B4A036A Address
            val: Display Val
            bitnum:Display Bit Number
            dotbit: Dot Display
 * Output   0 .. success
 *          1 .. length to long for buffer
 *          2 .. address send, NACK received
 *          3 .. data send, NACK received
 *          4 .. other twi error (lost bus arbitration, bus error, ..)
 */
int ZtLib::Seg8b4a036aDisplayHex(uint8_t addr,unsigned short val, uint8_t bitnum, uint8_t dotbit)
{
  uint8_t i;
  unsigned short temp;
  uint8_t segnum[5];
  segnum[0] = REG_DAT;
  temp = val;
  for (i=1; i<5; i++)
  {
      segnum[i] = temp&0x000F;
      temp >>= 4;
      segnum[i] = codetable[segnum[i]];
      if (dotbit&0x01)
      {
          segnum[i] |= 0x80;
      }
      dotbit >>= 1;
  }

  if (bitnum==DISP_0BIT)      {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;segnum[1] = 0;}
  else if (bitnum==DISP_1BIT) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;}
  else if (bitnum==DISP_2BIT) {segnum[4] = 0;segnum[3] = 0;}
  else if (bitnum==DISP_3BIT) {segnum[4] = 0;}
  else if (bitnum==DISP_AUTO)
  {
     if (!(val&0xFFF0))      {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;}
     else if (!(val&0xFF00)) {segnum[4] = 0;segnum[3] = 0;}
     else if (!(val&0xF000)) {segnum[4] = 0;}
  }

  return twi_writeTo(addr, segnum, 5, 1, 1);
}
Пример #8
0
int i2c_wr_blk(uint8_t cli_addr, uint8_t *dat, uint8_t len)
{
        if (len > TWI_BUFFER_LENGTH)
                return -1;

        return twi_writeTo(cli_addr, dat, len, USE_BUSY_WAIT, SEND_STOP_BIT);
}
Пример #9
0
/*
 * Function ScI2cMxDisplayDot16x16
 * Desc     Set ZT.SC-I2CMx Display 16*16 Dot
 * Input    addr:ZT.SC-I2CMx Address
            page:page
            column:column
            *str:16*16 Dot Data
 * Output   0 .. success
 *          1 .. length to long for buffer
 *          2 .. address send, NACK received
 *          3 .. data send, NACK received
 *          4 .. other twi error (lost bus arbitration, bus error, ..)
 */
void ZtLib::ScI2cMxDisplayDot16x16(uint8_t addr, uint8_t page, uint8_t column, unsigned char *str)
{
    uint8_t buff[17];
    buff[0] = REG_DAT;
    ScI2cMxSetLocation(addr, page, column);
    for (int i=0; i<16; i++)
    {
       buff[i+1] = str[i];
    }
    twi_writeTo(addr, buff, 17, 1, 1);
    ScI2cMxSetLocation(addr, page+1, column);
    for (int i=0; i<16; i++)
    {
       buff[i+1] = str[i+16];
    }
    twi_writeTo(addr, buff, 17, 1, 1);
}
Пример #10
0
uint8_t RTC_DS1307::isrunning(void) {
  twi_buf[0] = 0;
  twi_writeTo(DS1307_ADDRESS, 1);

  // perform blocking read into buffer
  (void)twi_readFrom(DS1307_ADDRESS, 1);
  uint8_t ss = twi_buf[0];
  return !(ss>>7);
}
Пример #11
0
uint8_t ICACHE_FLASH_ATTR wire_endTransmission()
{
	int8_t ret;
	ret = twi_writeTo(wire_txAddress, wire_txBuffer, wire_txBufferLength, true);
	wire_txBufferIndex = 0;
	wire_txBufferLength = 0;
	wire_transmitting = 0;
	return ret;
}
Пример #12
0
int i2c_wr_addr_byte(uint8_t cli_addr, uint8_t reg_addr, uint8_t dat)
{
        uint8_t buf[2];

        buf[0] = reg_addr;
        buf[1] = dat;
        return twi_writeTo(cli_addr, buf, sizeof(buf),
                                USE_BUSY_WAIT, SEND_STOP_BIT);
}
Пример #13
0
void pot_write(char channel, char address, unsigned char msg) {
  unsigned char buf[2];
  unsigned short pot = channel;
  if (address == OSCOPE_POT_VALUE && pot < POT_N_CHANNELS) {
    buf[0] = addrs[pot].pot_number? POT_CMD_WR1 : POT_CMD_WR0;
    buf[1] = msg;
    twi_writeTo(addrs[pot].i2c_addr, buf, sizeof(buf), 0);
  }
}
Пример #14
0
uint8_t twi_endTransmission() {
	// transmit buffer (blocking)
	int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, true);
	// reset tx buffer iterator vars
	txBufferIndex = 0;
	txBufferLength = 0;
	// indicate that we are done transmitting
	transmitting = 0;
	return ret;
}
Пример #15
0
int i2c_wr_addr16_byte(uint8_t cli_addr, uint16_t reg_addr, uint8_t dat)
{
        uint8_t buf[3];

        buf[0] = (uint8_t)((0xFF00 & reg_addr) >> 8);   /* reg addr MSB */
        buf[1] = (uint8_t)(0x00FF & reg_addr);          /* reg addr LSB */
        buf[2] = dat;
        return twi_writeTo(cli_addr, buf, sizeof(buf),
                                USE_BUSY_WAIT, SEND_STOP_BIT);
}
Пример #16
0
void TwoWire::endTransmission(void)
{
  // transmit buffer (blocking)
  twi_writeTo(txAddress, txBuffer, txBufferLength, 1);
  // reset tx buffer iterator vars
  txBufferIndex = 0;
  txBufferLength = 0;
  // indicate that we are done transmitting
  transmitting = 0;
}
Пример #17
0
/*
 * Function ScI2cMxDisplayArea
 * Desc     Set ZT.SC-I2CMx Display Area
 * Input    addr:ZT.SC-I2CMx Address
            spage: start page
            epage: end page
            scolumn: start column
            ecolumn: end column
            *pt: Data
 * Output   0 .. success
 *          1 .. length to long for buffer
 *          2 .. address send, NACK received
 *          3 .. data send, NACK received
 *          4 .. other twi error (lost bus arbitration, bus error, ..)
 */
void ZtLib::ScI2cMxDisplayArea(uint8_t addr, uint8_t spage, uint8_t epage, uint8_t scolumn, uint8_t ecolumn, const char *pt)
{
    uint8_t i = 0;
    uint8_t j = 0;
    uint8_t h = 0;
    uint8_t w = 0;
    uint16_t cnt = 0;
    uint8_t buff[32];
    buff[0] = REG_DAT;

    h = epage - spage;
    w = ecolumn - scolumn;

    while ( j<h )
    {
        ScI2cMxSetLocation(addr, spage + j, scolumn);
        uint8_t p=w;
        while(p)
        {
            if(p>=31)
            {
                for (int n=0; n<31; n++)
                {
                    buff[1+n] = pt[cnt++];
                }
                twi_writeTo(addr, buff, 32, 1, 1);
                p -= 31;
            }
            else
            {
                int n;
                for (n=0; n<p; n++)
                {
                    buff[1+n] = pt[cnt++];
                }
                twi_writeTo(addr, buff, n+1, 1, 1);
                p -= n;
            }
        }
        j++;
    }
}
Пример #18
0
/*
 * Function Seg8b4a036aReadVersion
 * Desc     Read ZT.SEG8B4A036A Fireware Version
 * Input    addr:ZT.SEG8B4A036A Address
            *buf:Version Buffer
 * Output   .. number bytes of Version Read out
 */
int ZtLib::Seg8b4a036aReadVersion(uint8_t addr, uint8_t *buf)
{
   uint8_t state = 0xFF;
   uint8_t temp;
   uint8_t regv[1] = {REG_VERSION};
   temp = twi_writeTo(addr, regv, 1, 1, 0); // no stop
   if (temp ==0)
   {
      temp = twi_readFrom(addr, &(*buf), 19, 1);
   }
   return temp;
}
Пример #19
0
void RTC_DS1307::adjust(const DateTime& dt) {
  twi_buf[0] = 0;
  twi_buf[1] = bin2bcd(dt.second());
  twi_buf[2] = bin2bcd(dt.minute());
  twi_buf[3] = bin2bcd(dt.hour());
  twi_buf[4] = bin2bcd(0);
  twi_buf[5] = bin2bcd(dt.day());
  twi_buf[6] = bin2bcd(dt.month());
  twi_buf[7] = bin2bcd(dt.year() - 2000);
  twi_buf[8] = 0;
  twi_writeTo(DS1307_ADDRESS, 9);
}
Пример #20
0
//
//	Originally, 'endTransmission' was an f(void) function.
//	It has been modified to take one parameter indicating
//	whether or not a STOP should be performed on the bus.
//	Calling endTransmission(false) allows a sketch to 
//	perform a repeated start. 
//
//	WARNING: Nothing in the library keeps track of whether
//	the bus tenure has been properly ended with a STOP. It
//	is very possible to leave the bus in a hung state if
//	no call to endTransmission(true) is made. Some I2C
//	devices will behave oddly if they do not see a STOP.
//
uint8_t TwoWire::endTransmission(uint8_t sendStop)
{
  if(txBufferLength == 0) return 0;
  // transmit buffer (blocking)
  int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop);
  // reset tx buffer iterator vars
  txBufferIndex = 0;
  txBufferLength = 0;
  // indicate that we are done transmitting
  transmitting = 0;
  return ret;
}
Пример #21
0
uint8_t i2c_end_transmission(uint8_t sendStop)
{
	// transmit buffer (blocking)
	uint8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop);
	// reset buffer vars
	txBufferIndex = 0;
	txBufferLength = 0;
	// set transmission flag
	transmitting = 0;

	return ret;
}
Пример #22
0
int i2c_wr_addr_blk(uint8_t cli_addr, uint8_t reg_addr,
                                                uint8_t *dat, uint8_t len)
{
        uint8_t buf[TWI_BUFFER_LENGTH];

        if ((len + 1) > TWI_BUFFER_LENGTH)
                return -1;

        buf[0] = reg_addr;
        memcpy(&buf[1], dat, len);
        return twi_writeTo(cli_addr, buf, (len + 1),
                                USE_BUSY_WAIT, SEND_STOP_BIT);
}
Пример #23
0
int i2c_rd_addr_byte(uint8_t cli_addr, uint8_t reg_addr, uint8_t *dat)
{
        uint8_t ret;

        ret = twi_writeTo(cli_addr, &reg_addr, 1, USE_BUSY_WAIT, SEND_STOP_BIT);
        if (ret != 0)
                return ret;

        ret = twi_readFrom(cli_addr, dat, 1, SEND_STOP_BIT);
        if (ret == 0)
                return -1;
        return 0;
}
Пример #24
0
int i2c_wr_addr16_blk(uint8_t cli_addr, uint16_t reg_addr,
                                                uint8_t *dat, uint8_t len)
{
        uint8_t buf[TWI_BUFFER_LENGTH];

        if ((len + 2) > TWI_BUFFER_LENGTH)
                return -1;

        buf[0] = (uint8_t)((0xFF00 & reg_addr) >> 8);   /* reg addr MSB */
        buf[1] = (uint8_t)(0x00FF & reg_addr);          /* reg addr LSB */
        memcpy(&buf[2], dat, len);
        return twi_writeTo(cli_addr, buf, (len + 2),
                                USE_BUSY_WAIT, SEND_STOP_BIT);
}
Пример #25
0
/*
 * Function ScI2cMxDisplay8x16Str
 * Desc     ZT.SC-I2CMx Display 8x16 English String
 * Input    addr:ZT.SC-I2CMx Address
            page: location page
            column: location column
            *str: 8X16 English String
 * Output   0 .. success
 *          1 .. length to long for buffer
 *          2 .. address send, NACK received
 *          3 .. data send, NACK received
 *          4 .. other twi error (lost bus arbitration, bus error, ..)
 */
int ZtLib::ScI2cMxDisplay8x16Str(uint8_t addr, uint8_t page, uint8_t column, const char *str)
{
    uint8_t i=0;
    uint8_t buff[19];
    buff[0] = REG_8X16STR;
    buff[1] = page;
    buff[2] = column;
    i=0;
    while ((*str != '\0') && (i<16))
    {
       buff[i+3] = (uint8_t)*str++;
       i++;
    }
    return twi_writeTo(addr, buff, i+3, 1, 1);
}
Пример #26
0
DateTime RTC_DS1307::now() {
  twi_buf[0] = 0;
  twi_writeTo(DS1307_ADDRESS, 1);

  (void)twi_readFrom(DS1307_ADDRESS, 7);

  uint8_t ss = bcd2bin(twi_buf[0] & 0x7F);
  uint8_t mm = bcd2bin(twi_buf[1]);
  uint8_t hh = bcd2bin(twi_buf[2]);
  uint8_t d  = bcd2bin(twi_buf[4]); // #3 IS SKIPPED
  uint8_t m  = bcd2bin(twi_buf[5]);
  uint16_t y = bcd2bin(twi_buf[6]) + 2000;

  return DateTime(y, m, d, hh, mm, ss);
}
Пример #27
0
int i2c_rd_addr_blk(uint8_t cli_addr, uint8_t reg_addr,
                                                uint8_t *dat, uint8_t len)
{
        uint8_t ret;

        if (len > TWI_BUFFER_LENGTH)
                return -1;

        ret = twi_writeTo(cli_addr, &reg_addr, 1, USE_BUSY_WAIT, SEND_STOP_BIT);
        if (ret != 0)
                return ret;

        ret = twi_readFrom(cli_addr, dat, len, SEND_STOP_BIT);
        if (ret == 0)
                return -1;
        return 0;
}
Пример #28
0
int i2c_rd_addr16_byte(uint8_t cli_addr, uint16_t reg_addr, uint8_t *dat)
{
        uint8_t buf[2];
        uint8_t ret;

        buf[0] = (uint8_t)((0xFF00 & reg_addr) >> 8);   /* reg addr MSB */
        buf[1] = (uint8_t)(0x00FF & reg_addr);          /* reg addr LSB */
        ret = twi_writeTo(cli_addr, buf, sizeof(buf),
                                USE_BUSY_WAIT, SEND_STOP_BIT);
        if (ret != 0)
                return ret;

        ret = twi_readFrom(cli_addr, dat, 1, SEND_STOP_BIT);
        if (ret == 0)
                return -1;
        return 0;
}
Пример #29
0
/*
 * Function Seg8b4a036aReadState
 * Desc     Read ZT.SEG8B4A036A Status
 * Input    addr:ZT.SEG8B4A036A Address
 * Output   !=0xFF ZT.SC-I2CMx Status
 *          0xFF .. other twi error (lost bus arbitration, bus error, ..)
 */
int ZtLib::Seg8b4a036aReadState(uint8_t addr)
{
   uint8_t state = 0xFF;
   uint8_t temp;
   uint8_t buff[1] = {REG_STATUS};
   temp = twi_writeTo(addr, buff, 1, 1, 0); // no stop
   if (temp ==0)
   {
      temp = twi_readFrom(addr, buff, 1, 1);
   }
   if (temp==1)
   {
      state = buff[0];
   }

   return state;
}
Пример #30
0
uint8_t TwoWire::endTransmission(void)
{
	// Secure I2C power management
	Wire.secureBegin();
	
	// transmit buffer (blocking)
	uint8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1);
	// reset tx buffer iterator vars
	txBufferIndex = 0;
	txBufferLength = 0;
	// indicate that we are done transmitting
	transmitting = 0;
	
	// Secure I2C power management
	Wire.secureEnd();
	
	return ret;
}