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); i2c_master_config_t master_config; I2C_MasterGetDefaultConfig(&master_config); I2C_MasterInit(i2c_addrs[obj->instance], &master_config, CLOCK_GetFreq(i2c_clocks[obj->instance])); I2C_EnableInterrupts(i2c_addrs[obj->instance], kI2C_GlobalInterruptEnable); pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); #if defined(FSL_FEATURE_PORT_HAS_OPEN_DRAIN) && FSL_FEATURE_PORT_HAS_OPEN_DRAIN PORT_Type *port_addrs[] = PORT_BASE_PTRS; PORT_Type *base = port_addrs[sda >> GPIO_PORT_SHIFT]; base->PCR[sda & 0xFF] |= PORT_PCR_ODE_MASK; base->PCR[scl & 0xFF] |= PORT_PCR_ODE_MASK; #endif }
/*! * @brief Main function */ int main(void) { i2c_slave_config_t slaveConfig; i2c_master_config_t masterConfig; uint32_t sourceClock; BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); PRINTF("\r\nI2C example -- MasterFunctionalInterrupt_SlaveFunctionalInterrupt.\r\n"); /* Enable master and slave NVIC interrupt. */ EnableIRQ(I2C_MASTER_IRQ); EnableIRQ(I2C_SLAVE_IRQ); /* Set i2c slave interrupt priority higher. */ NVIC_SetPriority(I2C_SLAVE_IRQ, 0); NVIC_SetPriority(I2C_MASTER_IRQ, 1); /*1.Set up i2c slave first*/ /* * slaveConfig.addressingMode = kI2C_Address7bit; * slaveConfig.enableGeneralCall = false; * slaveConfig.enableWakeUp = false; * slaveConfig.enableHighDrive = false; * slaveConfig.enableBaudRateCtl = false; * slaveConfig.enableSlave = true; */ I2C_SlaveGetDefaultConfig(&slaveConfig); slaveConfig.addressingMode = kI2C_Address7bit; slaveConfig.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT; I2C_SlaveInit(EXAMPLE_I2C_SLAVE_BASEADDR, &slaveConfig); for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { g_slave_buff[i] = 0; } /*2.Set up i2c master to send data to slave*/ for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { g_master_buff[i] = i; } PRINTF("Master will send data :"); for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { if (i % 8 == 0) { PRINTF("\r\n"); } PRINTF("0x%2x ", g_master_buff[i]); } PRINTF("\r\n\r\n"); /* * masterConfig.baudRate_Bps = 100000U; * masterConfig.enableHighDrive = false; * masterConfig.enableStopHold = false; * masterConfig.glitchFilterWidth = 0U; * masterConfig.enableMaster = true; */ I2C_MasterGetDefaultConfig(&masterConfig); masterConfig.baudRate_Bps = I2C_BAUDRATE; sourceClock = CLOCK_GetFreq(I2C_MASTER_CLK_SRC); I2C_MasterInit(EXAMPLE_I2C_MASTER_BASEADDR, &masterConfig, sourceClock); /* Master send address to slave. */ I2C_MasterStart(EXAMPLE_I2C_MASTER_BASEADDR, I2C_MASTER_SLAVE_ADDR_7BIT, kI2C_Write); /* Enable module interrupt. */ I2C_EnableInterrupts(EXAMPLE_I2C_MASTER_BASEADDR, kI2C_GlobalInterruptEnable); I2C_EnableInterrupts(EXAMPLE_I2C_SLAVE_BASEADDR, kI2C_GlobalInterruptEnable); /* Wait slave receive finished. */ while (g_slaveRxIndex < I2C_DATA_LENGTH) { } /* Disable module interrupt. */ I2C_DisableInterrupts(EXAMPLE_I2C_MASTER_BASEADDR, kI2C_GlobalInterruptEnable); I2C_DisableInterrupts(EXAMPLE_I2C_SLAVE_BASEADDR, kI2C_GlobalInterruptEnable); /* Master send stop command. */ I2C_MasterStop(EXAMPLE_I2C_MASTER_BASEADDR); /*3.Transfer completed. Check the data.*/ for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { if (g_slave_buff[i] != g_master_buff[i]) { PRINTF("\r\nError occured in this transfer ! \r\n"); break; } } PRINTF("Slave received data :"); for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { if (i % 8 == 0) { PRINTF("\r\n"); } PRINTF("0x%2x ", g_slave_buff[i]); } PRINTF("\r\n\r\n"); /*4.Set up slave ready to send data to master.*/ for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { g_slave_buff[i] = ~g_slave_buff[i]; } PRINTF("This time , slave will send data: :"); for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { if (i % 8 == 0) { PRINTF("\r\n"); } PRINTF("0x%2x ", g_slave_buff[i]); } PRINTF("\r\n\r\n"); /* Already setup the slave transfer ready in item 1. */ /* 5.Set up master to receive data from slave. */ for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { g_master_buff[i] = 0; } /* Master send address to slave. */ I2C_MasterStart(EXAMPLE_I2C_MASTER_BASEADDR, I2C_MASTER_SLAVE_ADDR_7BIT, kI2C_Read); /* Enable module interrupt. */ I2C_EnableInterrupts(EXAMPLE_I2C_MASTER_BASEADDR, kI2C_GlobalInterruptEnable); I2C_EnableInterrupts(EXAMPLE_I2C_SLAVE_BASEADDR, kI2C_GlobalInterruptEnable); g_masterReadBegin = true; /* Master put receive data in receive buffer. */ g_masterRxIndex = 0; /* Wait master receive finished. */ while (g_masterRxIndex < I2C_DATA_LENGTH) { } /* Disable module interrupt. */ I2C_DisableInterrupts(EXAMPLE_I2C_MASTER_BASEADDR, kI2C_GlobalInterruptEnable); I2C_DisableInterrupts(EXAMPLE_I2C_SLAVE_BASEADDR, kI2C_GlobalInterruptEnable); /*6.Transfer completed. Check the data.*/ for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { if (g_slave_buff[i] != g_master_buff[i]) { PRINTF("\r\nError occured in the transfer ! \r\n"); break; } } PRINTF("Master received data :"); for (uint32_t i = 0U; i < I2C_DATA_LENGTH; i++) { if (i % 8 == 0) { PRINTF("\r\n"); } PRINTF("0x%2x ", g_master_buff[i]); } PRINTF("\r\n\r\n"); PRINTF("\r\nEnd of I2C example .\r\n"); while (1) { } }