Working on configuring circut which allows TeensyA to blink an LED on TeensyB based on exmaple code included with i2c_t3 library. Currently getting "Sending to Slave: 'Data Message #2757' FAIL
Reading from Slave: FAIL" from the monitor. Photo of circut atttached.
basic_master
basic_slave
Reading from Slave: FAIL" from the monitor. Photo of circut atttached.
basic_master
Code:
// -------------------------------------------------------------------------------------------
// Basic Master
// -------------------------------------------------------------------------------------------
//
// This creates a simple I2C Master device which when triggered will send/receive a text
// string to/from a Slave device. It is intended to pair with a Slave device running the
// basic_slave sketch.
//
// Pull pin12 input low to send.
// Pull pin11 input low to receive.
//
// This example code is in the public domain.
//
// -------------------------------------------------------------------------------------------
#include <i2c_t3.h>
// Memory
#define MEM_LEN 256
char databuf[MEM_LEN];
int count;
void setup()
{
pinMode(LED_BUILTIN,OUTPUT); // LED
digitalWrite(LED_BUILTIN,LOW); // LED off
pinMode(12,INPUT_PULLUP); // Control for Send
pinMode(11,INPUT_PULLUP); // Control for Receive
// Setup for Master mode, pins 18/19, external pullups, 400kHz, 200ms default timeout
Wire.begin(I2C_MASTER, 0x00, I2C_PINS_18_19, I2C_PULLUP_EXT, 400000);
Wire.setDefaultTimeout(200000); // 200ms
// Data init
memset(databuf, 0, sizeof(databuf));
count = 0;
Serial.begin(115200);
}
void loop()
{
uint8_t target = 0x66; // target Slave address
size_t idx;
// Send string to Slave
//
if(digitalRead(12) == LOW)
{
digitalWrite(LED_BUILTIN,HIGH); // LED on
// Construct data message
sprintf(databuf, "Data Message #%d", count++);
// Print message
Serial.printf("Sending to Slave: '%s' ", databuf);
// Transmit to Slave
Wire.beginTransmission(target); // Slave address
for(idx = 0; idx <= strlen(databuf); idx++) // Write string to I2C Tx buffer (incl. string null at end)
Wire.write(databuf[idx]);
Wire.endTransmission(); // Transmit to Slave
// Check if error occured
if(Wire.getError())
Serial.print("FAIL\n");
else
Serial.print("OK\n");
digitalWrite(LED_BUILTIN,LOW); // LED off
delay(100); // Delay to space out tests
}
// Read string from Slave
//
if(digitalRead(11) == LOW)
{
digitalWrite(LED_BUILTIN,HIGH); // LED on
// Print message
Serial.print("Reading from Slave: ");
// Read from Slave
Wire.requestFrom(target, (size_t)MEM_LEN); // Read from Slave (string len unknown, request full buffer)
// Check if error occured
if(Wire.getError())
Serial.print("FAIL\n");
else
{
// If no error then read Rx data into buffer and print
idx = 0;
while(Wire.available())
databuf[idx++] = Wire.readByte();
Serial.printf("'%s' OK\n",databuf);
}
digitalWrite(LED_BUILTIN,LOW); // LED off
delay(100); // Delay to space out tests
}
}
basic_slave
Code:
// -------------------------------------------------------------------------------------------
// Basic Slave
// -------------------------------------------------------------------------------------------
//
// This creates a simple I2C Slave device which will print whatever text string is sent to it.
// It will retain the text string in memory and will send it back to a Master device if
// requested. It is intended to pair with a Master device running the basic_master sketch.
//
// This example code is in the public domain.
//
// -------------------------------------------------------------------------------------------
#include <i2c_t3.h>
// Function prototypes
void receiveEvent(size_t count);
void requestEvent(void);
// Memory
#define MEM_LEN 256
uint8_t databuf[MEM_LEN];
volatile uint8_t received;
//
// Setup
//
void setup()
{
pinMode(LED_BUILTIN,OUTPUT); // LED
// Setup for Slave mode, address 0x66, pins 18/19, external pullups, 400kHz
Wire.begin(I2C_SLAVE, 0x66, I2C_PINS_18_19, I2C_PULLUP_EXT, 400000);
// Data init
received = 0;
memset(databuf, 0, sizeof(databuf));
// register events
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
Serial.begin(115200);
}
void loop()
{
// print received data - this is done in main loop to keep time spent in I2C ISR to minimum
if(received)
{
digitalWrite(LED_BUILTIN,HIGH);
Serial.printf("Slave received: '%s'\n", (char*)databuf);
received = 0;
digitalWrite(LED_BUILTIN,LOW);
}
}
//
// handle Rx Event (incoming I2C data)
//
void receiveEvent(size_t count)
{
size_t idx=0;
while(idx < count)
{
if(idx < MEM_LEN) // drop data beyond mem boundary
databuf[idx++] = Wire.readByte(); // copy data to mem
else
Wire.readByte(); // drop data if mem full
}
received = count; // set received flag to count, this triggers print in main loop
}
//
// handle Tx Event (outgoing I2C data)
//
void requestEvent(void)
{
Wire.write(databuf, MEM_LEN); // fill Tx buffer (send full mem)
}