Multos Forums

   

M5-P19 I2C master example

RankRankRank

Total Posts: 74

Joined 2012-02-21

PM

This is bare bones example of using I2C in master mode with the M5-P19. The complete example including an Arduino sketch (to act as the slave) can be downloaded here.

// MULTOS P19 running in command mode either through ISO7816 interface or Serial interface(pin 18 low))
// Demonstrates using high level I2C calls to talk to an Arduino slave
// To run this, select the application then send the APDU CLA=00 INS=00 P1=00 P2=00 Lc=00
// 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", "11") 
#pragma attribute("access_list", "1007") 
#pragma attribute("name","I2C Master")

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

// I2C connections
#define SDA_PIN MI_PACKAGE_PIN_28_GPIO_PIN_NUMBER
#define SCL_PIN MI_PACKAGE_PIN_29_GPIO_PIN_NUMBER

#pragma melsession
BOOL initialised;

void abendFnc(void)
{
 miPerformRestart
();
}

void
main
(void)
{
 BYTE msg[4]
;  // To hold message from Arduino
 
QWORD rand;   // Random challenge to send to Arduino
 
BYTE bRecvd;  // Single byte received
 
BYTE bSend;   // Single byte sent
 
 // Uncomment following line if you want to debug the application in-chip from SmartDeck
 //miDebuggingEnable();
 
 
if(!initialised)
 
{  
  miSetAbendFunction
((WORD)abendFnc);
  
  
// Set up I2C interface
  
miI2CInitialise(SCL_PIN,SDA_PIN,1);
  
miI2CSetPeripheralAddress(0x53);  
  
initialised TRUE;
 
}
 
 
// Initialise reply buffer
 
bRecvd 0xCC;
 
msg[0] 0xCC;
 
msg[1] 0xCC;
 
msg[2] 0xCC;
 
msg[3] 0xCC;
 
 
// Get a random number - the challenge
 
rand multosGetRandomNumber();

 
// Send the first four bytes of it to Arduino register 1
 
miI2CRegisterWriteBytes(1,(BYTE*)&rand;.msdw,4);
 
miDelay(10);
 
 
// A byte from the second part to Arduino register 2
 
bSend rand.lsdw 0xFF;
 
miI2CRegisterWriteByte(2,bSend);
 
 
// Give Arduino time to copy things over to registers 3 and 4 then read back
 
miDelay(100);
 
miI2CRegisterReadBytes(3,msg,4);
 
bRecvd miI2CRegisterReadByte(4);
 
 
// Compare
 
if(bSend == bRecvd && memcmp((BYTE*)&rand;.msdw,msg,4) == 0)
  
multosExitSW(0x9000); // Passed
 
 
multosExitSW(0x9001); // Failed