@hansk
#define I2C_SCL_HIGH() (gpio_set_value(I2C_SCL, 1))
#define I2C_SCL_LOW() (gpio_set_value(I2C_SCL, 0))
#define I2C_SDA_HIGH() gpio_direction_input(I2C_SDA) // 释放SDA(外部上拉拉高)
#define I2C_SDA_LOW() gpio_direction_output(I2C_SDA, 0)
#define I2C_SDA_READ() gpio_get_value(I2C_SDA)
void init_gpio(void)
{
int ret = 0;
ret = gpio_request(I2C_SDA, NULL);
if(ret != 0)
{
printk("\n\n\n%s,%d,ncs8801 panel\n\n\n\n",__func__,__LINE__);
}
ret = gpio_request(I2C_SCL, NULL);
if(ret != 0)
{
printk("\n\n\n%s,%d,ncs8801 panel\n\n\n\n",__func__,__LINE__);
}
// 配置SCL为输出,初始高电平
gpio_direction_output(I2C_SDA, 1);
// SDA初始化为输出高电平(开漏模式需结合外部上拉)
gpio_direction_output(I2C_SCL, 1);
}
void deinit_gpio(void)
{
gpio_free(I2C_SCL);
gpio_free(I2C_SDA);
}
static void i2c_start(void)
{
I2C_SDA_HIGH();
I2C_SCL_HIGH();
udelay(5);
I2C_SDA_LOW();
udelay(5);
I2C_SCL_LOW();
}
static void i2c_stop(void)
{
I2C_SDA_LOW();
I2C_SCL_HIGH();
udelay(5);
I2C_SDA_HIGH();
udelay(5);
}
static int i2c_write_byte(uint8_t data)
{
int ack = 0;
int i;
for (i = 7; i >= 0; i--)
{
(data & (1 << i)) ? I2C_SDA_HIGH() : I2C_SDA_LOW();
udelay(2);
I2C_SCL_HIGH();
udelay(5);
I2C_SCL_LOW();
udelay(2);
}
// 释放 SDA 以便从机发送 ACK
I2C_SDA_HIGH();
I2C_SCL_HIGH();
udelay(2);
ack = I2C_SDA_READ() == 0; // 读取 ACK
I2C_SCL_LOW();
return ack;
}
static uint8_t i2c_read_byte(int ack)
{
uint8_t data = 0;
int i;
// 先设定 SDA 为输入模式
gpio_direction_input(I2C_SDA);
for (i = 7; i >= 0; i--)
{
I2C_SCL_HIGH();
udelay(2);
data |= (I2C_SDA_READ() << i);
I2C_SCL_LOW();
udelay(2);
}
// 发送 ACK 或 NACK
if (ack)
I2C_SDA_LOW();
else
I2C_SDA_HIGH(); // 释放 SDA 发送 NACK
I2C_SCL_HIGH();
udelay(5);
I2C_SCL_LOW();
return data;
}
int i2c_based_gpio_write(uint8_t i2cid, uint8_t addr, uint8_t send_val)
{
i2c_start();
if (!i2c_write_byte((i2cid << 1)))
{
i2c_stop();
return -1;
}
if (!i2c_write_byte(addr))
{
i2c_stop();
return -1;
}
if (!i2c_write_byte(send_val))
{
i2c_stop();
return -1;
}
i2c_stop();
return 0;
}
int i2c_based_gpio_write_lists(uint8_t i2cid, const struct reg_data *list, size_t count) {
size_t i;
for (i = 0; i < count; i++) {
if (i2c_based_gpio_write(i2cid, list[i].reg, list[i].val) < 0) {
return -1;
}
}
return 0;
}
int i2c_based_gpio_read(uint8_t i2cid, uint8_t addr, uint8_t *recv_val)
{
i2c_start();
if (!i2c_write_byte((i2cid << 1)))
{
i2c_stop();
return -1;
}
if (!i2c_write_byte(addr))
{
i2c_stop();
return -1;
}
i2c_start();
if (!i2c_write_byte((i2cid << 1) | 1))
{
i2c_stop();
return -1;
}
*recv_val = i2c_read_byte(1);
i2c_stop();
return 0;
}
i2c读写部分都在这儿了,写部分没问题了,读部分不知道有没有问题,写正常就点亮了我就没排查读了,我读ncs8801s时相关寄存器的值和预期不一样,但是屏亮了,我暂时不管了,后面有时间再看是值确实不对还是读的时序不对导致读出的值不对