Hi,
I've been trying to use the Launchpad (with the tm4c1294ncpdt) to send data to an Arduino Due, only so I can test the feature so I can use on a slave device I have.
When I use the "I2C_MASTER_CMD_SINGLE_SEND" command it works as expected, with all the data showing on the arduino without problems.
The problem is when I try to use the "Bust" option, because then the code doesn't get stuck or anything like that (verified using breakpoints) but the arduino doesn't receive anything.
Here's the code I've been using:
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#define NUM_I2C_DATA 26
//#define SLAVE_ADDRESS 0x78
#define SLAVE_ADDRESS 0x3C
int main(void) {
int32_t ui32SysClock;
char pui32DataTx[NUM_I2C_DATA];
uint32_t ui32Index;
//Hadware Configure
ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000);
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB2_I2C0SCL);
GPIOPinConfigure(GPIO_PB3_I2C0SDA);
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE,GPIO_PIN_2); //SCL
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3); //SDA
//I2C Configure
I2CMasterInitExpClk(I2C0_BASE, ui32SysClock, false); //false
I2CMasterSlaveAddrSet(I2C0_BASE, SLAVE_ADDRESS, false);
pui32DataTx[0] = 0x00;
pui32DataTx[1] = 0xae;
pui32DataTx[2] = 0xa8;
pui32DataTx[3] = 0x3f;
pui32DataTx[4] = 0xd3;
pui32DataTx[5] = 0x00;
pui32DataTx[6] = 0x40;
pui32DataTx[7] = 0xa1;
pui32DataTx[8] = 0xc8;
pui32DataTx[9] = 0xda;
pui32DataTx[10] = 0x12;
pui32DataTx[11] = 0x81;
pui32DataTx[12] = 0x7f;
pui32DataTx[13] = 0xa4;
pui32DataTx[14] = 0xa6;
pui32DataTx[15] = 0xd5;
pui32DataTx[16] = 0x80;
pui32DataTx[17] = 0x8d;
pui32DataTx[18] = 0x14;
pui32DataTx[19] = 0xd9;
pui32DataTx[20] = 0x22;
pui32DataTx[21] = 0xdb;
pui32DataTx[22] = 0x30;
pui32DataTx[23] = 0x20;
pui32DataTx[24] = 0x00;
pui32DataTx[25] = 0xaf;
while (1){
//for(ui32Index = 0; ui32Index < NUM_I2C_DATA; ui32Index++){
I2CMasterDataPut(I2C0_BASE, pui32DataTx[0]);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
//I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusy(I2C0_BASE))
{
}
//SysCtlDelay(ui32SysClock/3/1000); //delay 1ms
for(ui32Index = 1; ui32Index < NUM_I2C_DATA ; ui32Index++){
I2CMasterDataPut(I2C0_BASE, pui32DataTx[ui32Index]);
if (ui32Index != (NUM_I2C_DATA-1))
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
else
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
//I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusy(I2C0_BASE))
{
}
//SysCtlDelay(ui32SysClock/3/1000); //delay 1ms
}
}
return 0;
}
Do I need to do something so the launchpad will wait for an acknowledge or is the while(I2CMasterBusy(I2C0_BASE)) enough?
Thank you