From 94101a2cd9baed60360f68096033dc75cbb1dcb3 Mon Sep 17 00:00:00 2001
From: android <android@lingyun.com>
Date: Wed, 10 Jul 2024 19:27:36 +0800
Subject: [PATCH] Add STM8S003F3 eDP LCD drvier
---
mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/gpio_i2c.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 260 insertions(+), 0 deletions(-)
diff --git a/mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/gpio_i2c.c b/mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/gpio_i2c.c
new file mode 100644
index 0000000..fcfd58c
--- /dev/null
+++ b/mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/gpio_i2c.c
@@ -0,0 +1,260 @@
+/*********************************************************************************
+ * Copyright: (C) 2014 Guo Wenxue<guowenxue@gmail.com>
+ * All rights reserved.
+ *
+ * Filename: gpio_i2c.c
+ * Description: STM8 GPIO�I2C����
+ *
+ * Version: 1.0.0(09/28/2014)
+ * Author: Guo Wenxue <guowenxue@gmail.com>
+ * ChangeLog: 1, Release initial version on "09/28/2014 10:58:17 PM"
+ *
+ ********************************************************************************/
+
+#include "gpio_i2c.h"
+#include "timing_delay.h"
+
+/* ��ʼ�źţ�SCLΪ�ߵ�ƽʱ��SDA�ɸߵ�ƽ��͵�ƽ���䣬��ʼ��������. */
+void gpio_i2c_start(void)
+{
+ SDA_MODE_OUT;
+
+ SCL_LOW;
+ TIMDelay_N10us(1);
+ SDA_HIGH;
+ TIMDelay_N10us(1);
+ SCL_HIGH;
+ TIMDelay_N10us(1);
+
+ SDA_LOW;
+ TIMDelay_N10us(1);
+
+ SCL_LOW; /* Start֮��BUS����һ�㱻��Ϊ����ռ��״̬ */
+ TIMDelay_N10us(1);
+}
+
+/* �����źţ�SCLΪ�ߵ�ƽʱ��SDA�ɵ͵�ƽ��ߵ�ƽ���䣬������������. */
+void gpio_i2c_stop(void)
+{
+ SDA_MODE_OUT;
+
+ SCL_LOW;
+ TIMDelay_N10us(1);
+ SDA_LOW;
+ TIMDelay_N10us(1);
+
+ SCL_HIGH;
+ TIMDelay_N10us(1);
+
+ SDA_HIGH;
+ TIMDelay_N10us(1);
+}
+
+/* ���ڷ�����ЧӦ��λACK��Ҫ���ǣ��������ڵ�9��ʱ������֮ǰ��
+ *�͵�ƽ�ڼ佫SDA�����ͣ�����ȷ���ڸ�ʱ�ӵĸߵ�ƽ�ڼ�Ϊ�ȶ��ĵ͵�ƽ
+ */
+void gpio_i2c_send_ack(void)
+{
+ SDA_MODE_OUT;
+
+ /* Ĭ��SCL�ǵ͵�ƽ�����ڸı����ݣ��͵�ƽ��ʾACK */
+ SDA_LOW;
+ TIMDelay_N10us(1);
+
+ /* ʱ�������߲�ά��SDA״̬ */
+ SCL_HIGH;
+ TIMDelay_N10us(1);
+
+ /* �ָ�ʱ����Ϊ�͵�ƽ������æ */
+ SCL_LOW;
+ TIMDelay_N10us(1);
+}
+
+/* NACK(���������ߵĵ�ƽ����)����ʾ���ݳɹ�ʧ�� */
+void gpio_i2c_send_nak(void)
+{
+ SDA_MODE_OUT;
+
+ /* Ĭ��SCL�ǵ͵�ƽ�����ڸı����ݣ��ߵ�ƽ��ʾNAK */
+ SDA_HIGH;
+ TIMDelay_N10us(1);
+
+ /* ʱ�������߲�ά��SDA״̬ */
+ SCL_HIGH;
+ TIMDelay_N10us(1);
+
+ /* �ָ�ʱ����Ϊ�͵�ƽ������æ */
+ SCL_LOW;
+ TIMDelay_N10us(1);
+}
+
+/* I2C ���߶�һ��ACK�ź�
+ * ����ֵ:0 �յ�ACK 1: �յ�NAK
+ */
+uint8_t gpio_i2c_wait_ack(void)
+{
+ uint8_t rv;
+ uint8_t times = 200;
+
+ SDA_MODE_IN;
+
+ /* ʱ�������� */
+ SCL_HIGH;
+ TIMDelay_N10us(1);
+
+ do
+ {
+ times --;
+ } while ( (SDA_DAT==1) && (times!=0) );
+
+ if( !times )
+ {
+ /* �ȴ� ACK ��ʱ�����յ�NAK */
+ rv = I2C_NAK;
+ goto OUT;
+ }
+
+ /* �ȵ�ACK */
+ SCL_LOW;
+ TIMDelay_N10us(1);
+
+ rv = I2C_ACK;
+
+OUT:
+ return rv;
+}
+
+/* I2C���߷���һ���ֽ�����:
+ * ����ֵ:0 ���ͳɹ����ȵ�ACK 1: ����ʧ��,�յ�NAK
+ */
+uint8_t gpio_i2c_write_byte(uint8_t byte)
+{
+ int i;
+ uint8_t rv = I2C_ACK;
+
+ SDA_MODE_OUT;
+
+ /* SCLΪ�͵�ƽʱ,SDA�߲��ܸı䴫���bit; SCLΪ�ߵ�ƽʱ,SDA�߱����ȶ� */
+ for(i=7; i>=0; i--) /* MSB */
+ {
+ /*MSB: �����Ӧλ�ĵ�ƽ�ź� */
+ if( byte&(1<<i) )
+ SDA_HIGH;
+ else
+ SDA_LOW;
+ TIMDelay_N10us(1);
+
+ SCL_HIGH;
+ TIMDelay_N10us(1);
+
+ SCL_LOW;
+ TIMDelay_N10us(1);
+ }
+
+ rv = gpio_i2c_wait_ack();
+ return rv;
+}
+
+/* I2C���߽���һ���ֽ����� */
+uint8_t gpio_i2c_read_byte(void)
+{
+ uint8_t bit;
+ uint8_t byte = 0;
+
+ SDA_MODE_IN;
+
+ for(bit=0; bit<8; bit++)
+ {
+ byte <<= 1;
+ SCL_HIGH;
+ TIMDelay_N10us(2);
+
+ if(SDA_DAT)
+ byte |= 1;
+
+ SCL_LOW;
+ TIMDelay_N10us(2);
+ }
+
+ gpio_i2c_send_ack();
+ return byte;
+}
+
+uint8_t gpio_i2c_read(uint8_t addr, uint8_t reg_addr)
+{
+ int rv;
+ uint8_t data = 0;
+
+ // Start condition
+ gpio_i2c_start();
+
+ // Send the slave address with write bit and check for ACK
+ if (I2C_ACK != gpio_i2c_write_byte(addr | I2C_DIR_WRITE))
+ {
+ rv = I2C_ERROR;
+ goto OUT;
+ }
+
+ // Send the register address and check for ACK
+ if (I2C_ACK != gpio_i2c_write_byte(reg_addr))
+ {
+ rv = I2C_ERROR;
+ goto OUT;
+ }
+
+ // Repeated start condition
+ gpio_i2c_start();
+
+ // Send the slave address with read bit and check for ACK
+ if (I2C_ACK != gpio_i2c_write_byte(addr | I2C_DIR_READ))
+ {
+ rv = I2C_ERROR;
+ goto OUT;
+ }
+
+ // Read the data byte
+ data = gpio_i2c_read_byte();
+
+ rv = data;
+
+OUT:
+ gpio_i2c_stop();
+ if (rv == I2C_ERROR)
+ {
+ return -1;
+ }
+ return rv;
+}
+
+
+
+int gpio_i2c_write(uint8_t addr, uint8_t reg_addr, uint8_t data)
+{
+ int rv = I2C_OK;
+
+ gpio_i2c_start();
+
+ // Send the slave device address with the write bit and check for ACK
+ if (I2C_ACK != gpio_i2c_write_byte(addr | I2C_DIR_WRITE))
+ {
+ rv = I2C_ERROR;
+ goto OUT;
+ }
+
+ // Send the register address and check for ACK
+ if (I2C_ACK != gpio_i2c_write_byte(reg_addr))
+ {
+ rv = I2C_ERROR;
+ goto OUT;
+ }
+
+ // Send the data byte and check for ACK
+ if (I2C_ACK != gpio_i2c_write_byte(data))
+ {
+ rv = I2C_ERROR;
+ }
+
+OUT:
+ gpio_i2c_stop();
+ return rv;
+}
--
Gitblit v1.9.1