Resurrect the state machine of frozen IS31FL3731 ICs by toggling SCL and SDA.

This commit is contained in:
László Monda
2017-09-30 20:34:35 +02:00
parent cec8bbfe01
commit b87042a44a
2 changed files with 68 additions and 0 deletions

View File

@@ -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

View File

@@ -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();