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

查看: 4342|回复: 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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版