Joeluo 发表于 2024-6-7 20:16

求中颖SH367309 I2C读写例程

在调试SH367309,单片机设置ROM配置不成功,哪位高人能发个例程!不胜感激!邮箱:21688812@qq.com

daichaodai 发表于 2024-6-12 08:55

I2C例程多的很,随便找一个其他MCU的程序参考一下就完事了。

呐咯密密 发表于 2024-6-12 11:20

如果可以接受模拟的,就直接找一个,修改一下GPIO设置部分就行

可怜的小弗朗士 发表于 2024-6-12 14:12

这个肯定是网上找啊,一大堆

Henryko 发表于 2024-6-27 15:34

可以去找个iic的库移植一下

LEDyyds 发表于 2024-6-27 15:56

官方的例程就有

LEDyyds 发表于 2024-6-27 15:56

或者直接用模拟吧

tpgf 发表于 2024-6-27 16:06

操作rom和操作fhash的时序是一样的吗

黑心单片机 发表于 2024-6-27 16:42

找一个模拟的先试试能不能成

keaibukelian 发表于 2024-6-27 16:43

在设置rom的时候要保证芯片的最低供电电压是多少呢

paotangsan 发表于 2024-6-27 18:21

rom是不是不能配置啊 因为它是只读的存储单元啊

heimaojingzhang 发表于 2024-6-27 20:13

楼主写错了吧 是不是应该配置寄存器啊

晓伍 发表于 2024-6-28 10:46

这个是不是时序上出现问题了 建议楼主使用示波器看看波形

观海 发表于 2024-6-28 13:39

配置不成功的具体表现是什么呢

QNSD 发表于 2025-7-2 11:08

eeprom 只能读取 不能写入 写入前 MODE是高采集模式 LDO_EN 拉地 SHIP 拉高VPRO 8.2v供电测试SCONF1写入 反复失败有没有类似问题的朋友 求解

桃乐丝 发表于 2025-7-5 16:05

基于标准 I2C 时序编写
/* SH367309 I2C通信例程 */

// I2C引脚定义 (需根据实际硬件连接修改)
#define I2C_SCL_PIN   P1_0// 时钟线
#define I2C_SDA_PIN   P1_1// 数据线

// I2C延时函数 (调整延时以匹配目标设备速度)
void I2C_Delay(void) {
    volatile uint8_t i = 20;
    while(i--);
}

// I2C起始信号
void I2C_Start(void) {
    I2C_SDA_PIN = 1;
    I2C_SCL_PIN = 1;
    I2C_Delay();
    I2C_SDA_PIN = 0;
    I2C_Delay();
    I2C_SCL_PIN = 0;
}

// I2C停止信号
void I2C_Stop(void) {
    I2C_SDA_PIN = 0;
    I2C_SCL_PIN = 1;
    I2C_Delay();
    I2C_SDA_PIN = 1;
    I2C_Delay();
}

// 发送ACK信号
void I2C_SendAck(void) {
    I2C_SDA_PIN = 0;
    I2C_SCL_PIN = 1;
    I2C_Delay();
    I2C_SCL_PIN = 0;
}

// 发送NACK信号
void I2C_SendNack(void) {
    I2C_SDA_PIN = 1;
    I2C_SCL_PIN = 1;
    I2C_Delay();
    I2C_SCL_PIN = 0;
}

// 等待从机ACK
bit I2C_WaitAck(void) {
    bit ack;
    I2C_SDA_PIN = 1;// 释放SDA线,等待从机应答
    I2C_SCL_PIN = 1;
    I2C_Delay();
    ack = I2C_SDA_PIN;
    I2C_SCL_PIN = 0;
    return ack;       // 0=ACK, 1=NACK
}

// 发送一个字节
void I2C_SendByte(uint8_t dat) {
    uint8_t i;
    for(i=0; i<8; i++) {
      I2C_SDA_PIN = (dat & 0x80) ? 1 : 0;
      I2C_SCL_PIN = 1;
      I2C_Delay();
      I2C_SCL_PIN = 0;
      dat <<= 1;
    }
}

// 接收一个字节
uint8_t I2C_ReceiveByte(void) {
    uint8_t i, dat = 0;
    I2C_SDA_PIN = 1;// 释放SDA线
    for(i=0; i<8; i++) {
      dat <<= 1;
      I2C_SCL_PIN = 1;
      I2C_Delay();
      if(I2C_SDA_PIN) dat |= 0x01;
      I2C_SCL_PIN = 0;
    }
    return dat;
}

// I2C写操作 (设备地址、寄存器地址、数据缓冲区、数据长度)
bit I2C_Write(uint8_t devAddr, uint8_t regAddr, uint8_t *buf, uint8_t len) {
    uint8_t i;
    I2C_Start();
    I2C_SendByte(devAddr & 0xFE);// 写操作地址
    if(I2C_WaitAck()) goto err;
   
    I2C_SendByte(regAddr);         // 寄存器地址
    if(I2C_WaitAck()) goto err;
   
    for(i=0; i<len; i++) {
      I2C_SendByte(buf);
      if(I2C_WaitAck()) goto err;
    }
    I2C_Stop();
    return 1;// 成功
   
err:
    I2C_Stop();
    return 0;// 失败
}

// I2C读操作 (设备地址、寄存器地址、数据缓冲区、数据长度)
bit I2C_Read(uint8_t devAddr, uint8_t regAddr, uint8_t *buf, uint8_t len) {
    I2C_Start();
    I2C_SendByte(devAddr & 0xFE);// 写操作地址(发送寄存器地址)
    if(I2C_WaitAck()) goto err;
   
    I2C_SendByte(regAddr);         // 寄存器地址
    if(I2C_WaitAck()) goto err;
   
    I2C_Start();                   // 重新开始
    I2C_SendByte(devAddr | 0x01);// 读操作地址
    if(I2C_WaitAck()) goto err;
   
    while(len > 1) {
      *buf++ = I2C_ReceiveByte();
      I2C_SendAck();
      len--;
    }
    *buf = I2C_ReceiveByte();      // 最后一个字节
    I2C_SendNack();
    I2C_Stop();
    return 1;// 成功
   
err:
    I2C_Stop();
    return 0;// 失败
}

// 示例:读取设备0x50的寄存器0x10开始的5个字节数据
void Example_Read(void) {
    uint8_t data;
    if(I2C_Read(0x50, 0x10, data, 5)) {
      // 读取成功,处理data[]
    } else {
      // 读取失败
    }
}

// 示例:向设备0x50的寄存器0x20写入3个字节数据
void Example_Write(void) {
    uint8_t data = {0xAA, 0x55, 0x33};
    if(I2C_Write(0x50, 0x20, data, 3)) {
      // 写入成功
    } else {
      // 写入失败
    }
}
页: [1]
查看完整版本: 求中颖SH367309 I2C读写例程