/************************************************************************ * Copyright(c) 2023 Levetop Semiconductor Co.,Led. All rights reserved. * @file iic.c * @author UartTFT Application Team * @version V1.0.0 * @date 2023-02-24 * @brief *************************************************************************/ #include "iic.h" #define TIMEOUT 50000 #define hwI2C0_Device_Addr 0x28 extern uint8_t bI2C0_TxM_Data[16]; extern uint8_t bI2C0_RxM_Data[128]; uint8_t IIC_Buf[128]; uint32_t u32Tmp; uint8_t tmpID, tmpEvent; uint32_t u16Tmp, tmpX, tmpY; uint16_t tpX[10], tpY[10]; uint32_t TPmaxX, TPmaxY; uint8_t tpActive; void i2c_delay(uint8_t us) { uint8_t i; // for (i = 0; i < us; i++) // asm("NOP"); } void I2cInit(void) { I2C_ConfigGpio(I2C_SDA, GPIO_OUTPUT); I2C_ConfigGpio(I2C_SCL, GPIO_OUTPUT); SPI_ConfigGpio(SPI3, SPI_SS, GPIO_OUTPUT); EPORT_ConfigGpio(EPORT_PIN4, GPIO_INPUT); } void i2c_sda_output(void) { I2C_ConfigGpio(I2C_SDA, GPIO_OUTPUT); } void i2c_sda_input(void) { I2C_ConfigGpio(I2C_SDA, GPIO_INPUT); } void i2c_set_scl(uint8_t index) { if (index) I2C_WriteGpioData(I2C_SCL, 1); else I2C_WriteGpioData(I2C_SCL, 0); } void i2c_set_sda(uint8_t index) { if (index) I2C_WriteGpioData(I2C_SDA, 1); else I2C_WriteGpioData(I2C_SDA, 0); } uint8_t i2c_get_sda(void) { if (I2C_ReadGpioData(I2C_SDA)) return 1; else return 0; } void i2c_start(void) { i2c_sda_output(); i2c_set_sda(1); i2c_set_scl(1); DelayUS(20); i2c_set_sda(0); DelayUS(2); i2c_set_scl(0); DelayUS(2); } void i2c_stop(void) { i2c_sda_output(); i2c_set_scl(0); i2c_set_sda(0); i2c_set_scl(1); DelayUS(2); i2c_set_sda(1); DelayUS(2); } uint8_t i2c_write(uint8_t value) { uint8_t i, j, ack; i2c_sda_output(); i2c_set_scl(0); for (i = 0; i < 8; i++) { if (value & 0x80) i2c_set_sda(1); else i2c_set_sda(0); DelayUS(2); i2c_set_scl(1); DelayUS(3); i2c_set_scl(0); value = value << 1; } i2c_sda_input(); DelayUS(20); i2c_set_scl(1); DelayUS(1); ack = i2c_get_sda(); i2c_set_scl(0); return ack; } uint8_t i2c_read(uint8_t ack) { uint8_t i, j, u8Tmp; i2c_sda_input(); u8Tmp = 0x00; for (i = 0; i < 8; i++) { u8Tmp = u8Tmp << 1; i2c_set_scl(0); DelayUS(3); i2c_set_scl(1); DelayUS(2); if (i2c_get_sda()) u8Tmp |= 0x01; } i2c_set_scl(0); i2c_sda_output(); if (ack) i2c_set_sda(0); else i2c_set_sda(1); DelayUS(20); i2c_set_scl(1); DelayUS(2); i2c_set_scl(0); return u8Tmp; } void read_xy(void) { uint8_t i; uint32_t crcVal; i2c_start(); i2c_write(0x82); i2c_write(0x10); i2c_stop(); i2c_start(); i2c_write(0x82 + 1); for (i = 0; i < 31; i++) { IIC_Buf[i] = i2c_read(1); } i2c_read(0); i2c_stop(); u32Tmp = IIC_Buf[1] & 0x7F; u32Tmp = (u32Tmp << 8) & 0xFF00; u32Tmp += IIC_Buf[2]; tmpX = u32Tmp; u32Tmp = IIC_Buf[3] & 0x7F; u32Tmp = (u32Tmp << 8) & 0xFF00; u32Tmp += IIC_Buf[4]; tmpY = u32Tmp; }