I'm sending only a char (letter m);
And sometimes arduino shows the letter m , other times shows the ascii code.
Using the software logic to see the communication I can realize that arduino never sends the ACK to the master.
I'm using the arduino example code. the code is not mine .
Microchip code (MASTER)
#include "p24fxxxx.h"
#include "i2c.h"
#define Fosc (8000000) // crystal
#define Fcy (Fosc*4/2) // w.PLL (Instruction Per Second)
#define Fsck 400000 // 400kHz I2C
#define I2C1_BRG ((Fcy/2/Fsck)-1)
int main(void) {
char SlaveAddress = 0x4;
char c='b';
OpenI2C1(I2C_ON, I2C1_BRG);
while(1){
while(1){
StartI2C1 (); //Send the Start Bit
IdleI2C1(); ////Wait to complete
MasterWriteI2C1((SlaveAddress<<0)|0); //Send device advice adress byte to the slave with the write indication
IdleI2C1(); //Wait to complete
//ACKSTAT is 0 when slave acknowledge,
//if 1 then slave has not acknowledge the data.
if( I2C1STATbits.ACKSTAT ) //ACKSTAT=1 NACK is received from the slave
{
StopI2C1(); //Send the Stop condition
IdleI2C1(); //Wait to complete
IdleI2C1();
}
else
{
break;
}
}
MasterWriteI2C1 (c);
IdleI2C1();
}
}
Arduino (slave)
// Wire Slave Receiver
// by Nicholas Zambetti http://www.zambetti.com
// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this
// Created 29 March 2006
// This example code is in the public domain.
#include <Wire.h>
void setup()
{
Wire.begin(4); // join i2c bus with address #4
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
}
void loop()
{
delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
while (1 < Wire.available()) // loop through all but the last
{
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x); // print the integer
}