Other Parts Discussed in Thread: INA237
Tool/software:
Hi team,
Greetings...
I am facing issues to read/write to a register address. I attached my code for your reference. Please suggest me some tips to resolve this.
#include <ti/devices/msp432e4/driverlib/driverlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include "uartstdio.h"
#include "pinout.h"
#define SLAVE_ADDRESS 0x4A // I2C address
#define I2C_NUM_DATA 2 // Number of bytes to read
#define TIMEOUT 10000 // Timeout value in iterations
uint8_t registerAddress = 0x05; // REGISTER ADDRESS
uint8_t writeData[2] = {0xBF, 0xD0}; // {HIGH_BYTE(15-8),LOW_BYTE(7-0)}
uint32_t g_ui32SysClock;
uint8_t getData[I2C_NUM_DATA] = {0x00}; // Buffer to hold the receiving data
uint32_t timeoutCounter;
void ConfigureUART(void) {
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
MAP_GPIOPinConfigure(GPIO_PA0_U0RX);
MAP_GPIOPinConfigure(GPIO_PA1_U0TX);
MAP_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig(0, 115200, g_ui32SysClock);
}
void I2C_ReadRegister(uint8_t regAddress, uint8_t *data) {
uint8_t dataIndex = 0;
// Send register address
MAP_I2CMasterSlaveAddrSet(I2C3_BASE, SLAVE_ADDRESS, false);
MAP_I2CMasterDataPut(I2C3_BASE, regAddress);
MAP_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_SEND);
timeoutCounter = 0;
while (MAP_I2CMasterBusy(I2C3_BASE))
{
MAP_SysCtlDelay(1000);
if (++timeoutCounter > TIMEOUT)
{
UARTprintf("TRANSFER TIMEOUT\n");
return;
}
}
if (MAP_I2CMasterErr(I2C3_BASE) != I2C_MASTER_ERR_NONE)
{
UARTprintf("TRANSFER ERROR\n");
return;
}
MAP_SysCtlDelay(3000);
// Read data
MAP_I2CMasterSlaveAddrSet(I2C3_BASE, SLAVE_ADDRESS, true);
MAP_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
timeoutCounter = 0;
while (MAP_I2CMasterBusy(I2C3_BASE))
{
MAP_SysCtlDelay(1000);
if (++timeoutCounter > TIMEOUT)
{
UARTprintf("TRANSFER TIMEOUT\n");
return;
}
}
if (MAP_I2CMasterErr(I2C3_BASE) != I2C_MASTER_ERR_NONE)
{
UARTprintf("TRANSFER ERROR\n");
return;
}
data[dataIndex++] = MAP_I2CMasterDataGet(I2C3_BASE);
MAP_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT); // Rx another
timeoutCounter = 0;
while (MAP_I2CMasterBusy(I2C3_BASE))
{
MAP_SysCtlDelay(1000);
if (++timeoutCounter > TIMEOUT)
{
UARTprintf("TRANSFER TIMEOUT\n");
return;
}
}
if (MAP_I2CMasterErr(I2C3_BASE) != I2C_MASTER_ERR_NONE)
{
UARTprintf("TRANSFER ERROR\n");
return;
}
MAP_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
while (MAP_I2CMasterBusy(I2C3_BASE))
{
MAP_SysCtlDelay(1000);
if (++timeoutCounter > TIMEOUT)
{
UARTprintf("TRANSFER TIMEOUT\n");
return;
}
}
if (MAP_I2CMasterErr(I2C3_BASE) != I2C_MASTER_ERR_NONE)
{
UARTprintf("TRANSFER ERROR\n");
return;
}
data[dataIndex++] = MAP_I2CMasterDataGet(I2C3_BASE);
}
void I2C_WriteRegister(uint8_t regAddress, uint8_t *data, uint8_t length) {
while (MAP_I2CMasterBusy(I2C3_BASE)) {}
MAP_I2CMasterSlaveAddrSet(I2C3_BASE, SLAVE_ADDRESS, false);
MAP_I2CMasterDataPut(I2C3_BASE, regAddress);
MAP_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_START);
timeoutCounter = 0;
while (MAP_I2CMasterBusy(I2C3_BASE)) {
if (++timeoutCounter > TIMEOUT) {
UARTprintf("TRANSFER TIMEOUT\n");
return;
}
}
if (MAP_I2CMasterErr(I2C3_BASE) != I2C_MASTER_ERR_NONE) {
UARTprintf("TRANSFER ERROR\n");
return;
}
for (uint8_t i = 0; i < length; i++) {
MAP_I2CMasterDataPut(I2C3_BASE, data[i]);
if (i == length - 1) {
MAP_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
} else {
MAP_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
}
timeoutCounter = 0;
while (MAP_I2CMasterBusy(I2C3_BASE)) {
if (++timeoutCounter > TIMEOUT) {
UARTprintf("TRANSFER TIMEOUT\n");
return;
}
}
if (MAP_I2CMasterErr(I2C3_BASE) != I2C_MASTER_ERR_NONE) {
UARTprintf("TRANSFER ERROR\n");
return;
}
}
}
void writeOperation(){
int w = 0;
while(w<20){
uint32_t systemClock;
g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 12000000);
//g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); // 120 MHz
PinoutSet(false, false);
ConfigureUART();
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPION)));
MAP_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0);
MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, 0);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOK)));
MAP_GPIOPinConfigure(GPIO_PK4_I2C3SCL);
MAP_GPIOPinConfigure(GPIO_PK5_I2C3SDA);
MAP_GPIOPinTypeI2C(GPIO_PORTK_BASE, GPIO_PIN_5);
MAP_GPIOPinTypeI2CSCL(GPIO_PORTK_BASE, GPIO_PIN_4);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_I2C3)));
MAP_I2CMasterInitExpClk(I2C3_BASE, g_ui32SysClock, false);
w++;
I2C_WriteRegister(registerAddress, writeData, 2);
UARTprintf("Data written to Register 0x%02X: 0x%02X 0x%02X\n", registerAddress, writeData[0], writeData[1]);
UARTprintf("########################################################################################################################");
}
UARTprintf("Now writing different data");
}
void readOperation(){
int i = 0;
while (i<20) {
uint32_t systemClock;
g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); // 120 MHz
PinoutSet(false, false);
ConfigureUART();
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPION)));
MAP_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0);
MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, 0);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOK)));
MAP_GPIOPinConfigure(GPIO_PK4_I2C3SCL);
MAP_GPIOPinConfigure(GPIO_PK5_I2C3SDA);
MAP_GPIOPinTypeI2C(GPIO_PORTK_BASE, GPIO_PIN_5);
MAP_GPIOPinTypeI2CSCL(GPIO_PORTK_BASE, GPIO_PIN_4);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_I2C3)));
MAP_I2CMasterInitExpClk(I2C3_BASE, g_ui32SysClock, false);
I2C_ReadRegister(registerAddress, getData);
uint16_t rawValue = (getData[0] << 8) | getData[1];
UARTprintf("Register 0x%02X High Byte: 0x%02X\n", registerAddress, getData[0]);
UARTprintf("Register 0x%02X Low Byte: 0x%02X\n", registerAddress, getData[1]);
UARTprintf("Register 0x%02X Combined Value: 0x%04X\n", registerAddress, rawValue);
UARTprintf("**********************************\n");
combinedValues[i] = rawValue;
// MAP_SysCtlDelay(g_ui32SysClock / 3);
MAP_SysCtlDelay(g_ui32SysClock / 13); ///////////////////////// CHANGED FROM MAP_SysCtlDelay(g_ui32SysClock / 3) TO MAP_SysCtlDelay(g_ui32SysClock / 13) TO DECRESE THE DELAY FOR READING.
MAP_SysCtlDelay(20);
i++;
}
uint8_t k = 0;
UARTprintf("Combined Values Array:\n");
for (k = 0; k < 20; k++) {
UARTprintf("combinedValues[%d]: 0x%04X\n", k, combinedValues[k]);
}
uint16_t firstDifferentValue = findFirstDifferent(combinedValues, 20);
UARTprintf("Read Operation Result : 0x%04X\n", firstDifferentValue);
}
char getUserInput() {
char inputChar = UARTgetc();
return inputChar;
}
int main(void) {
uint32_t systemClock;
g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 12000000);
PinoutSet(false, false);
ConfigureUART();
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPION)));
MAP_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0);
MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, 0);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOK)));
MAP_GPIOPinConfigure(GPIO_PK4_I2C3SCL);
MAP_GPIOPinConfigure(GPIO_PK5_I2C3SDA);
MAP_GPIOPinTypeI2C(GPIO_PORTK_BASE, GPIO_PIN_5);
MAP_GPIOPinTypeI2CSCL(GPIO_PORTK_BASE, GPIO_PIN_4);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_I2C3)));
MAP_I2CMasterInitExpClk(I2C3_BASE, g_ui32SysClock, false);
UARTprintf("################################################## ????????????????????????????????????????????????? ########################################\n");
UARTprintf("Enter 'y' or 'Y' to perform read and write operation. Enter 'n' or 'N' to perform only read operation: ");
char input = getUserInput();
if ((input == 'y' || input == 'Y')) {
readOperation();
writeOperation();
}
else if ((input == 'n' || input == 'N')) {
readOperation();
}
else {
UARTprintf("Invalid input. Please enter 'y' or 'Y' for read and write operation, or 'n' or 'N' for only read operation.\n");
}
return 0;
}
I also attach the external pullup of 3.8k to SCL and SDA of MSP432E401y.
I didnt have two MSP's to try "mastermode simple transfer" code availabe in driverlib(but i followed the steps of both the example program and i2c Application Report
SLAA776).
Please assist me ASAP.
Regards,
Raja Venkateshwaran