你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4352|回复: 12

STM8L I2C EEPROM燒寫問題

[复制链接]

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-10-28 14:27:33 | 显示全部楼层 |阅读模式
我使用硬體I2C去做24C32燒寫
正在測試I2C READ BYTE跟WRITE BYTE時發現了一些問題如下,
I2C READ如果加上回傳會出現讀出來的數據錯誤
 
WRITE程式如下
void I2C_EE_ByteWrite(uint8_t pBuffer,uint16_t WriteAddr)
{
  uint8_t at24C02_to_16_addr;
 
 
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
 
 I2C_GenerateSTART(I2C1,ENABLE);
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
 
 #ifdef AT24C32_64 
 
 I2C_Send7bitAddress(I2C1,(uint8_t)EEPROM_ADDRESS,I2C_Direction_Transmitter);//EEPROM_ADDRESS
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
 I2C_SendData(I2C1,(uint8_t)((WriteAddr&0xFF00)>>8));  //MSB
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // TXOK?
 
 I2C_SendData(I2C1,(uint8_t)(WriteAddr&0x00FF));     //LSB
 
 #else //AT24C02 to 16
 
 at24C02_to_16_addr=(uint8_t)((WriteAddr&0x0E00)>>7);
 
 I2C_Send7bitAddress(I2C1,EEPROM_ADDRESS|at24C02_to_16_addr,I2C_Direction_Transmitter);//EEPROM_ADDRESS &MSB
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
 I2C_SendData(I2C1,(uint8_t)(WriteAddr&0x00FF));     //LSB
 
 #endif
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // TXOK?
 
 I2C_SendData(I2C1,pBuffer);
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // TXOK?
 
 I2C_GenerateSTOP(I2C1,ENABLE);
 
 delay(EEPROM_DLY);
}
 
READ如下
uint8_t I2C_EE_ByteRead(uint16_t WriteAddr)
{
 uint8_t at24C02_to_16_addr,read_data;
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
 
 I2C_GenerateSTART(I2C1,ENABLE);
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
 
 #ifdef AT24C32_64
 
 I2C_Send7bitAddress(I2C1,(uint8_t)EEPROM_ADDRESS,I2C_Direction_Transmitter);//EEPROM_ADDRESS
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
 I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
 
 I2C_SendData(I2C1,(uint8_t)((WriteAddr&0xFF00)>>8));  //MSB
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // TXOK?
 
 I2C_SendData(I2C1,(uint8_t)(WriteAddr&0x00FF));     //LSB
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // TXOK?
 
 I2C_GenerateSTART(I2C1,ENABLE);
 
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 
 I2C_Send7bitAddress(I2C1,(uint8_t)EEPROM_ADDRESS,I2C_Direction_Receiver); //RECEIVER
 
 
 #else
 
 at24C02_to_16_addr=(uint8_t)((WriteAddr>>7)&0x0E);
 at24C02_to_16_addr=at24C02_to_16_addr|EEPROM_ADDRESS;
 
 I2C_Send7bitAddress(I2C1,at24C02_to_16_addr,I2C_Direction_Transmitter);//EEPROM_ADDRESS &MSB
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
 I2C_SendData(I2C1,(uint8_t)(WriteAddr));     //LSB
 
 while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); // TXOK?
 
 I2C_GenerateSTART(I2C1,ENABLE);
 
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 
 I2C_Send7bitAddress(I2C1,(uint8_t)at24C02_to_16_addr,I2C_Direction_Receiver); //RECEIVER
 
 #endif
 
 while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));  //RX FLAG
 
 read_data=I2C_ReceiveData(I2C1);
 
 I2C_AcknowledgeConfig(I2C1,ENABLE); //NONE ACK
 
 I2C_GenerateSTOP(I2C1,ENABLE);
 
 //return read_data;
}
拿掉return read_data;收下的資料居然正確,加上RETURN會不正確
麻煩幫小弟看一下,謝謝
<
回复

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2013-10-28 18:32:03 | 显示全部楼层

回复:STM8L I2C EEPROM燒寫問題


 
 
很怪的問題,都沒人想挑戰看看?
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2013-10-29 08:59:42 | 显示全部楼层

RE:STM8L I2C EEPROM燒寫問題

仿真一下在return以前, read_data的值是多少,return以后 read_data的值是多少。
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2013-10-29 09:10:04 | 显示全部楼层

回复:STM8L I2C EEPROM燒寫問題

回复第 3 楼 于2013-10-29 08:59:42发表:
仿真一下在return以前, read_data的值是多少,return以后 read_data的值是多少。
 
 

RETURN之前,read_data就錯了,數據是161,拿掉return read_data;讀到的資料都是正確的
回复 支持 反对

使用道具 举报

3

主题

161

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-10-29 12:48:07 | 显示全部楼层

RE:STM8L I2C EEPROM燒寫問題

你的函数定义的是void型,所以不能加返回值
回复 支持 反对

使用道具 举报

2

主题

46

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-10-29 14:36:40 | 显示全部楼层

RE:STM8L I2C EEPROM燒寫問題

void I2C_EE_ByteWrite(uint8_t pBuffer,uint16_t WriteAddr)
注意到你这个函数的返回值是VOID  应该没有返回值的
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2013-10-29 14:56:32 | 显示全部楼层

回复:STM8L I2C EEPROM燒寫問題

回复第 5 楼 于2013-10-29 12:48:07发表:
你的函数定义的是void型,所以不能加返回值
 
 

那是write,抱歉我沒加上分格線所以導致漏看,read function下面
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2013-10-29 14:58:56 | 显示全部楼层

回复:STM8L I2C EEPROM燒寫問題

回复第 6 楼 于2013-10-29 14:36:40发表:
void I2C_EE_ByteWrite(uint8_t pBuffer,uint16_t WriteAddr)
注意到你这个函数的返回值是VOID  应该没有返回值的
 
 

READ如下
uint8_t I2C_EE_ByteRead(uint16_t WriteAddr)
您看到write,write byte沒有返傳
謝謝回覆...希望問題能獲得解決
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2013-10-29 16:19:27 | 显示全部楼层

RE:STM8L I2C EEPROM燒寫問題

应该和return没有关系,你看一下I2C_ReceiveData返回的值的类型。
回复 支持 反对

使用道具 举报

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2013-10-29 17:08:20 | 显示全部楼层

回复:STM8L I2C EEPROM燒寫問題

回复第 9 楼 于2013-10-29 16:19:27发表:
应该和return没有关系,你看一下I2C_ReceiveData返回的值的类型。
 
 

同型,都是uint8_t
謝謝回覆
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版