Merge pull request #7823 from codeauroraforum/MIMXRT1050_Fix_I2C

MIMXRT1050_EVK: Update the I2C driver
pull/7890/head
Cruz Monrreal 2018-08-21 09:54:36 -05:00 committed by GitHub
commit 4b5c6c8953
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 21 additions and 17 deletions

View File

@ -37,7 +37,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
uint32_t i2c_sda = pinmap_peripheral(sda, PinMap_I2C_SDA);
uint32_t i2c_scl = pinmap_peripheral(scl, PinMap_I2C_SCL);
obj->instance = pinmap_merge(i2c_sda, i2c_scl);
obj->next_repeated_start = 0;
MBED_ASSERT((int)obj->instance != NC);
lpi2c_master_config_t master_config;
@ -50,6 +50,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
pinmap_pinout(sda, PinMap_I2C_SDA);
pinmap_pinout(scl, PinMap_I2C_SCL);
pin_mode(sda, PullUp_22K);
pin_mode(scl, PullUp_22K);
pin_mode_opendrain(sda, true);
pin_mode_opendrain(scl, true);
}
@ -65,7 +68,6 @@ int i2c_start(i2c_t *obj)
int i2c_stop(i2c_t *obj)
{
obj->next_repeated_start = 0;
if (LPI2C_MasterStop(i2c_addrs[obj->instance]) != kStatus_Success) {
return 1;
}
@ -78,7 +80,7 @@ void i2c_frequency(i2c_t *obj, int hz)
uint32_t busClock;
busClock = i2c_get_clock();
LPI2C_MasterSetBaudRate(i2c_addrs[obj->instance], hz, busClock);
LPI2C_MasterSetBaudRate(i2c_addrs[obj->instance], busClock, hz);
}
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
@ -92,13 +94,9 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
master_xfer.direction = kLPI2C_Read;
master_xfer.data = (uint8_t *)data;
master_xfer.dataSize = length;
if (obj->next_repeated_start) {
master_xfer.flags |= kLPI2C_TransferRepeatedStartFlag;
}
if (!stop) {
master_xfer.flags |= kLPI2C_TransferNoStopFlag;
}
obj->next_repeated_start = master_xfer.flags & kLPI2C_TransferNoStopFlag ? 1 : 0;
/* The below function will issue a STOP signal at the end of the transfer.
* This is required by the hardware in order to receive the last byte
@ -120,11 +118,20 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
return I2C_ERROR_NO_SLAVE;
}
/* Wait till START has been flushed out of the FIFO */
while (!(base->MSR & kLPI2C_MasterBusBusyFlag)) {
}
/* Send the STOP signal */
base->MTDR = LPI2C_MTDR_CMD(0x2U);
/* Wait till STOP has been sent successfully */
while (!(base->MSR & kLPI2C_MasterStopDetectFlag)) {
}
if (base->MSR & kLPI2C_MasterNackDetectFlag) {
i2c_stop(obj);
return I2C_ERROR_NO_SLAVE;
} else {
i2c_stop(obj);
return length;
}
}
@ -134,13 +141,9 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
master_xfer.direction = kLPI2C_Write;
master_xfer.data = (uint8_t *)data;
master_xfer.dataSize = length;
if (obj->next_repeated_start) {
master_xfer.flags |= kLPI2C_TransferRepeatedStartFlag;
}
if (!stop) {
master_xfer.flags |= kLPI2C_TransferNoStopFlag;
}
obj->next_repeated_start = master_xfer.flags & kLPI2C_TransferNoStopFlag ? 1 : 0;
if (LPI2C_MasterTransferBlocking(base, &master_xfer) != kStatus_Success) {
return I2C_ERROR_NO_SLAVE;

View File

@ -50,7 +50,6 @@ struct analogin_s {
struct i2c_s {
uint32_t instance;
uint8_t next_repeated_start;
};
struct spi_s {

View File

@ -54,7 +54,8 @@ void pin_function(PinName pin, int function)
}
/* Write to the mux register */
*((volatile uint32_t *)muxregister) = IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(function);
*((volatile uint32_t *)muxregister) = IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(function) |
IOMUXC_SW_MUX_CTL_PAD_SION((function >> SION_BIT_SHIFT) & 0x1);
/* If required write to the input daisy register */
daisyregister = (function >> DAISY_REG_SHIFT) & 0xFFF;

View File

@ -37,6 +37,7 @@ typedef enum {
#define STDIO_UART_RX USBRX
#define STDIO_UART UART_1
#define SION_BIT_SHIFT (3)
#define DAISY_REG_SHIFT (4)
#define DAISY_REG_VALUE_SHIFT (16)

View File

@ -39,12 +39,12 @@ const PinMap PinMap_DAC[] = {
/************I2C***************/
const PinMap PinMap_I2C_SDA[] = {
{GPIO_AD_B1_01, I2C_1, ((1U << DAISY_REG_VALUE_SHIFT) | (0x4D0 << DAISY_REG_SHIFT) | 3)},
{GPIO_AD_B1_01, I2C_1, ((1U << DAISY_REG_VALUE_SHIFT) | (0x4D0 << DAISY_REG_SHIFT) | (1U << SION_BIT_SHIFT) | 3)},
{NC , NC , 0}
};
const PinMap PinMap_I2C_SCL[] = {
{GPIO_AD_B1_00, I2C_1, ((1U << DAISY_REG_VALUE_SHIFT) | (0x4CC << DAISY_REG_SHIFT) | 3)},
{GPIO_AD_B1_00, I2C_1, ((1U << DAISY_REG_VALUE_SHIFT) | (0x4CC << DAISY_REG_SHIFT) | (1U << SION_BIT_SHIFT) | 3)},
{NC , NC , 0}
};