打印
[电池电源管理]

求中颖SH367309 I2C读写例程

[复制链接]
10795|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Joeluo|  楼主 | 2024-6-7 20:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试SH367309,单片机设置ROM配置不成功,哪位高人能发个例程!不胜感激!邮箱:21688812@qq.com

使用特权

评论回复
沙发
daichaodai| | 2024-6-12 08:55 | 只看该作者
I2C例程多的很,随便找一个其他MCU的程序参考一下就完事了。

使用特权

评论回复
板凳
呐咯密密| | 2024-6-12 11:20 | 只看该作者
如果可以接受模拟的,就直接找一个,修改一下GPIO设置部分就行

使用特权

评论回复
地板
可怜的小弗朗士| | 2024-6-12 14:12 | 只看该作者
这个肯定是网上找啊,一大堆

使用特权

评论回复
5
Henryko| | 2024-6-27 15:34 | 只看该作者
可以去找个iic的库移植一下

使用特权

评论回复
6
LEDyyds| | 2024-6-27 15:56 | 只看该作者
官方的例程就有

使用特权

评论回复
7
LEDyyds| | 2024-6-27 15:56 | 只看该作者
或者直接用模拟吧

使用特权

评论回复
8
tpgf| | 2024-6-27 16:06 | 只看该作者
操作rom和操作fhash的时序是一样的吗

使用特权

评论回复
9
黑心单片机| | 2024-6-27 16:42 | 只看该作者
找一个模拟的先试试能不能成

使用特权

评论回复
10
keaibukelian| | 2024-6-27 16:43 | 只看该作者
在设置rom的时候要保证芯片的最低供电电压是多少呢

使用特权

评论回复
11
paotangsan| | 2024-6-27 18:21 | 只看该作者
rom是不是不能配置啊 因为它是只读的存储单元啊

使用特权

评论回复
12
heimaojingzhang| | 2024-6-27 20:13 | 只看该作者
楼主写错了吧 是不是应该配置寄存器啊

使用特权

评论回复
13
晓伍| | 2024-6-28 10:46 | 只看该作者
这个是不是时序上出现问题了 建议楼主使用示波器看看波形

使用特权

评论回复
14
观海| | 2024-6-28 13:39 | 只看该作者
配置不成功的具体表现是什么呢

使用特权

评论回复
15
QNSD| | 2025-7-2 11:08 | 只看该作者
eeprom 只能读取 不能写入 写入前 MODE是高采集模式 LDO_EN 拉地 SHIP 拉高  VPRO 8.2v供电  测试SCONF1写入 反复失败  有没有类似问题的朋友 求解

使用特权

评论回复
16
桃乐丝| | 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[i]);
        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[5];
    if(I2C_Read(0x50, 0x10, data, 5)) {
        // 读取成功,处理data[]
    } else {
        // 读取失败
    }
}

// 示例:向设备0x50的寄存器0x20写入3个字节数据
void Example_Write(void) {
    uint8_t data[3] = {0xAA, 0x55, 0x33};
    if(I2C_Write(0x50, 0x20, data, 3)) {
        // 写入成功
    } else {
        // 写入失败
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝