Multos Forums

   

M5-P19 I2C slave example

RankRankRank

Total Posts: 74

Joined 2012-02-21

PM

This is a barebones example of using the M5-P19 as an I2C slave. It also makes use of a serial port to output messages. The full source for the demo can be downloaded here and it includes an Arduino sketch to act as the I2C master device.

// MULTOS P19 running in Embedded mode (pin 18 high or n/c)
// Demonstrates using high level I2C calls to talk to an Arduino with the Arduino as the master
// To run, load the application first (in Command Mode) then reset the power in Embedded mode
// Uses CAPI-V2 so make sure you have the latest version of SmartDeck (3.1.x.x or later) and multos.h
#pragma attribute("aid", "12")
#pragma attribute("access_list", "1007")
#pragma attribute("name", "I2C Slave")

#include <multos.h>
#include <mi.h>
#include <stdio.h>
#include <string.h>

// I2C commands
enum cmd_t {INCREMENT=0};
typedef struct {
 BYTE cmd
;
 
BYTE len;
 
BYTE data[255];
} input_t;

MI_I2C_SLAVE_CONFIG config { 0x00//address mode = 7bit
        
0x0010//address
        
0x0104//rxBufferSize = 260 bytes
        
0x00//bus Speed (fixed RFU)
        
0x01//frameStartHandlingEnabled (fixed RFU)
        
0x01//clockStretchingEnabled
        
0x01//stopOnCollision
        
0x1400 //port Config SDA=GPIO 1.1, SCL=GPIO 1.0
};

#pragma melsession
input_t command;

void abendFnc(void)
{
 BYTE code
;
 
 
// Get abend reason code
 
code miAbendReason();
 
 
// Output abend details on serial port
 
printf("Abend code %d\n",code);
 
 
miPerformRestart();
}

void
main
(void)
{
 BYTE id
;
 
BYTE i;

 
// The command arrives on the serial port
 // If starting up for the first time
 
id miGetEmbeddedEventId();
 if( 
id == MI_EMBEDDED_EVENT_STARTUP)
 
{
  
// Register abend handler
  
miSetAbendFunction((WORD)abendFnc);
  
  
// Set up I2C
  
miI2CSlaveInitialise (&config;);
  
  
// Set up serial port to output messages using printf
  
miSerialIOInitialise(MI_PACKAGE_PIN_27_GPIO_PIN_NUMBER,MI_PACKAGE_PIN_26_GPIO_PIN_NUMBER,9600,MI_SERIAL_IO_8_BITS_NO_PARITY_1_STOP_BIT,100);
  
  
// Register for I2C events
  
miRegisterEmbeddedEvent (AM_EMBEDDED_EVENT_I2C_SLAVE0);
  
  return;
 
}

 
// Should only get to here if an I2C event has occurred
 
 // Read I2C data
 
miI2CSlaveGetReceivedBytes((BYTE *)&command;,sizeof(command));
 
printf("Received command %d len %d\n",command.cmdcommand.len);
 for(
i=0;i<command.len;i++)
  
printf("x ",command.data[i]);
 
printf("\n");
 
 
// Do the requested command
 
switch(command.cmd)
 
{
  
case INCREMENT// Add one to all bytes in the data
   
for(i=0;i<command.len;i++)
    
command.data[i] ++;
   break;

  default:
   
memset(command.data,0xCC,4);
   
command.len 4;
   break;
 
}

 
// Output result
 
miI2CSlaveTransmitBytes((BYTE *)&command;,2+command.len);