#include "fsl_common.h" #include "fsl_port.h" #include "test_led.h" #include "init_peripherals.h" #include "i2c_addresses.h" #include "fsl_i2c.h" #include "fsl_clock.h" #include "i2c.h" #include "led_pwm.h" #include "slave_protocol_handler.h" static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *userData) { switch (xfer->event) { case kI2C_SlaveTransmitEvent: SlaveProtocolHandler(); xfer->data = SlaveTxBuffer; xfer->dataSize = SlaveTxSize; break; case kI2C_SlaveReceiveEvent: SlaveProtocolHandler(); xfer->data = SlaveRxBuffer; xfer->dataSize = SLAVE_RX_BUFFER_SIZE; break; case kI2C_SlaveCompletionEvent: xfer->data = NULL; xfer->dataSize = 0; break; case kI2C_SlaveTransmitAckEvent: break; default: break; } } void InitI2c(void) { port_pin_config_t pinConfig = { .pullSelect = kPORT_PullUp, }; CLOCK_EnableClock(I2C_BUS_SDA_CLOCK); CLOCK_EnableClock(I2C_BUS_SCL_CLOCK); pinConfig.mux = I2C_BUS_MUX; PORT_SetPinConfig(I2C_BUS_SDA_PORT, I2C_BUS_SDA_PIN, &pinConfig); PORT_SetPinConfig(I2C_BUS_SCL_PORT, I2C_BUS_SCL_PIN, &pinConfig); i2c_slave_config_t slaveConfig; i2c_slave_handle_t slaveHandle; I2C_SlaveGetDefaultConfig(&slaveConfig); slaveConfig.slaveAddress = I2C_ADDRESS_LEFT_KEYBOARD_HALF; I2C_SlaveInit(I2C_BUS_BASEADDR, &slaveConfig); I2C_SlaveTransferCreateHandle(I2C_BUS_BASEADDR, &slaveHandle, i2cSlaveCallback, NULL); slaveHandle.eventMask |= kI2C_SlaveCompletionEvent; I2C_SlaveTransferNonBlocking(I2C_BUS_BASEADDR, &slaveHandle, kI2C_SlaveCompletionEvent); } void InitLedDriver(void) { CLOCK_EnableClock(LED_DRIVER_SDB_CLOCK); PORT_SetPinMux(LED_DRIVER_SDB_PORT, LED_DRIVER_SDB_PIN, kPORT_MuxAsGpio); GPIO_PinInit(LED_DRIVER_SDB_GPIO, LED_DRIVER_SDB_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0}); GPIO_WritePinOutput(LED_DRIVER_SDB_GPIO, LED_DRIVER_SDB_PIN, 1); } void InitPeripherals(void) { InitLedDriver(); InitTestLed(); LedPwm_Init(); InitI2c(); }