diff --git a/cores/arduino/RingBuffer.cpp b/cores/arduino/RingBuffer.cpp index ba9522ce2ae99f4d5d24057feae7b81e8a6d95b6..92d82098e034c5e89b14156cd8f061e4253a2612 100644 --- a/cores/arduino/RingBuffer.cpp +++ b/cores/arduino/RingBuffer.cpp @@ -51,7 +51,7 @@ int RingBuffer::read_char() if(_iTail == _iHead) return -1; - int value = _aucBuffer[_iTail]; + uint8_t value = _aucBuffer[_iTail]; _iTail = nextIndex(_iTail); return value; diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp index f14f858486abce45b9b813add3bc4ed857de836a..31fc51aa9c55caf52d02c96245c29dee6ea81c11 100644 --- a/cores/arduino/SERCOM.cpp +++ b/cores/arduino/SERCOM.cpp @@ -448,7 +448,7 @@ bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag } // Clean the 'Slave on Bus' flag, for further usage. - sercom->I2CM.INTFLAG.bit.SB = 0x1ul; + //sercom->I2CM.INTFLAG.bit.SB = 0x1ul; } @@ -550,9 +550,9 @@ uint8_t SERCOM::readDataWIRE( void ) { if(isMasterWIRE()) { - while( sercom->I2CM.INTFLAG.bit.SB == 0 || sercom->I2CM.STATUS.bit.CLKHOLD == 0 ) + while( sercom->I2CM.INTFLAG.bit.SB == 0 ) { - // Waiting complete receive, Clock holding & synchronization finished + // Waiting complete receive } return sercom->I2CM.DATA.bit.DATA ; diff --git a/cores/validation/validation_chuck/test.cpp b/cores/validation/validation_chuck/test.cpp index e6e3fd4d104a40e60cd310201e345c319549ba0f..9e5698eb3512b6b3b927fdf3c5b424ea56ad444e 100644 --- a/cores/validation/validation_chuck/test.cpp +++ b/cores/validation/validation_chuck/test.cpp @@ -1,15 +1,12 @@ +#include <Arduino.h> #include <Wire.h> -#include "nunchuck_funcs.h" -int loop_cnt=0 ; - -byte accx,accy,zbut,cbut ; -int ledPin = 13 ; +uint8_t accx,accy,zbut,cbut ; void setup() { Serial5.begin( 115200 ) ; - Serial5.println("nunchuck_init"); + Serial5.println("nunchuk init"); Wire.begin(); // join i2c bus as master Wire.beginTransmission(0x52);// transmit to device 0x52 @@ -17,17 +14,16 @@ void setup() Wire.write((uint8_t)0x00);// sends sent a zero. Wire.endTransmission();// stop transmitting - Serial5.println( "WiiChuckDemo ready" ) ; - delay(3000); + Serial5.println( "WiiChukDemo ready" ) ; + delay(100); } void loop() { Wire.requestFrom(0x52, 6); - - uint8_t jX = Wire.read(); - uint8_t jY = Wire.read(); + uint8_t jX = Wire.read(); + uint8_t jY = Wire.read(); uint8_t accX = Wire.read(); uint8_t accY = Wire.read(); uint8_t accZ = Wire.read(); @@ -46,6 +42,10 @@ void loop() Serial5.print(accZ); Serial5.print("\tBtn : "); + Serial5.print(" ["); + Serial5.print(misc); + Serial5.print("] "); + switch(misc & 0x3ul) { case 0x0ul: @@ -67,11 +67,11 @@ void loop() default: break; } - Wire.beginTransmission(0x52);// transmit to device 0x52 - Wire.write((uint8_t)0x00);// sends sent a zero. + Wire.write((uint8_t)0x00);// sends sent a zero. Wire.endTransmission();// stop transmitting delay(100); + } diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 9ab0d25a182a2a8b146ccf1f8d03cb3f0fb48cc5..7b92a534f9d2a67f48a0771011661fcd8f31b5a6 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -50,18 +50,28 @@ void TwoWire::begin(uint8_t address) { uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit) { - size_t toRead = quantity + 1; + if(quantity == 0) + { + return 0; + } + + + size_t byteRead = 0; if(sercom->startTransmissionWIRE(address, WIRE_READ_FLAG)) { + + // Read first data + rxBuffer.store_char(sercom->readDataWIRE()); + // Connected to slave - while(toRead--) - //for(toRead = quantity; toRead >= 0; --toRead) + //while(toRead--) + for(byteRead = 0; byteRead < quantity; ++byteRead) { - if( toRead == 0) // Stop transmission + if( byteRead == quantity - 1) // Stop transmission { sercom->prepareNackBitWIRE(); // Prepare NACK to stop slave transmission - sercom->readDataWIRE(); // Clear data register to send NACK + //sercom->readDataWIRE(); // Clear data register to send NACK sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop } else // Continue transmission @@ -73,7 +83,7 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit) } } - return quantity - toRead; + return byteRead; } uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity)