diff --git a/right/src/i2c.h b/right/src/i2c.h index 8a95302..c010c38 100644 --- a/right/src/i2c.h +++ b/right/src/i2c.h @@ -15,10 +15,12 @@ #define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable. #define I2C_MAIN_BUS_MUX kPORT_MuxAlt7 + #define I2C_MAIN_BUS_SDA_GPIO GPIOD #define I2C_MAIN_BUS_SDA_PORT PORTD #define I2C_MAIN_BUS_SDA_CLOCK kCLOCK_PortD #define I2C_MAIN_BUS_SDA_PIN 3 + #define I2C_MAIN_BUS_SCL_GPIO GPIOD #define I2C_MAIN_BUS_SCL_PORT PORTD #define I2C_MAIN_BUS_SCL_CLOCK kCLOCK_PortD #define I2C_MAIN_BUS_SCL_PIN 2 diff --git a/right/src/i2c_watchdog.c b/right/src/i2c_watchdog.c index bcf1062..fba9553 100644 --- a/right/src/i2c_watchdog.c +++ b/right/src/i2c_watchdog.c @@ -1,6 +1,8 @@ #include "fsl_pit.h" #include "fsl_i2c.h" #include "fsl_clock.h" +#include "fsl_port.h" +#include "fsl_gpio.h" #include "i2c.h" #include "i2c_watchdog.h" #include "slave_scheduler.h" @@ -21,6 +23,70 @@ void PIT_I2C_WATCHDOG_HANDLER(void) i2c_master_config_t masterConfig; I2C_MasterGetDefaultConfig(&masterConfig); I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR); + + PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio); + GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); + PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio); + GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); + + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + + GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + + GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0); + for (volatile uint32_t i=0; i<10000; i++); + GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1); + for (volatile uint32_t i=0; i<10000; i++); + + port_pin_config_t pinConfig = { + .pullSelect = kPORT_PullUp, + .openDrainEnable = kPORT_OpenDrainEnable + }; + pinConfig.mux = I2C_MAIN_BUS_MUX; + PORT_SetPinConfig(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, &pinConfig); + PORT_SetPinConfig(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, &pinConfig); + uint32_t sourceClock = CLOCK_GetFreq(I2C_MASTER_BUS_CLK_SRC); I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock); InitSlaveScheduler();