求中颖SH367309 I2C读写例程
在调试SH367309,单片机设置ROM配置不成功,哪位高人能发个例程!不胜感激!邮箱:21688812@qq.com I2C例程多的很,随便找一个其他MCU的程序参考一下就完事了。 如果可以接受模拟的,就直接找一个,修改一下GPIO设置部分就行 这个肯定是网上找啊,一大堆 可以去找个iic的库移植一下 官方的例程就有 或者直接用模拟吧 操作rom和操作fhash的时序是一样的吗 找一个模拟的先试试能不能成 在设置rom的时候要保证芯片的最低供电电压是多少呢rom是不是不能配置啊 因为它是只读的存储单元啊
楼主写错了吧 是不是应该配置寄存器啊
这个是不是时序上出现问题了 建议楼主使用示波器看看波形
配置不成功的具体表现是什么呢
eeprom 只能读取 不能写入 写入前 MODE是高采集模式 LDO_EN 拉地 SHIP 拉高VPRO 8.2v供电测试SCONF1写入 反复失败有没有类似问题的朋友 求解 基于标准 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]