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