80

帖子

0

TA的资源

禁止访问

21
 
提示: 作者被禁止或删除 内容自动屏蔽
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

22
 

回复

I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
这一句很危险啊 很多死机都是卡在这边的

改为while(I2C1->SR1&0x01<=0);就好了

STM32的库一个字烂
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

23
 

原来在51下模拟的时候是有超时检测的

                                 这个是把模拟程序翻译过来的,但是超时检测那段没翻译,就是为了验证一下这个功能,自己可以去修改,另外我觉得如果I2C老死在这上面的话说明他的这个接口做的还有毛病,首先我是基于相信这个硬件接口非常可靠的前提下才
此帖出自stm32/stm8论坛
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

24
 

楼主:我用了你的程序终于能读写了

但是,我第一次读写都正确,第二次读的数据只能读到一个字节,不知道为什么.
如果我重新运行一次I2C初始化就可以正确读到数据.难道我每次读写的时候都要重新初始化I2C一次吗?
下面是我的程序:
/* Private define ------------------------------------------------------------*/
#define EEPROM_WriteAddress1    0x05
#define EEPROM_ReadAddress1     0x05
#define BufferSize1             (countof(Tx1_Buffer)-1)
#define BufferSize2             (countof(Tx2_Buffer)-1)
#define EEPROM_WriteAddress2    (EEPROM_WriteAddress1 + BufferSize1)
#define EEPROM_ReadAddress2     (EEPROM_ReadAddress1 + BufferSize1)

/* Private macro -------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))

/* Private variables ---------------------------------------------------------*/
u8 Tx1_Buffer[] = "/* STM32F10x I2C Firmware 123456789";
u8 Tx2_Buffer[] = "Library Example */";
u8 Rx1_Buffer[BufferSize1], Rx2_Buffer[BufferSize2];
volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = FAILED;
ErrorStatus HSEStartUpStatus;
    
/* Private functions ---------------------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength);
extern void delay(void);

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* NVIC configuration ------------------------------------------------------*/
  NVIC_Configuration();

  /* Initialize the I2C EEPROM driver ----------------------------------------*/
  I2C_EE_Init();  

  I2C_PageWrite_AT24C01_02(EEPROM_Block0_ADDRESS,EEPROM_WriteAddress1,Tx1_Buffer,BufferSize1);
    
  I2C_SequentialRead_AT24C01_02(EEPROM_Block0_ADDRESS,EEPROM_ReadAddress1,Rx1_Buffer,BufferSize1);

/* Check if the data written to the memory is read correctly */
  TransferStatus1 = Buffercmp(Tx1_Buffer, Rx1_Buffer, BufferSize1);

  /* Wait for EEPROM standby state */
  I2C_EE_WaitEepromStandbyState();

  /* Second write in the memory followed by a read of the written data -------*/
  /* Write on I2C EEPROM from EEPROM_WriteAddress2 */
  I2C_PageWrite_AT24C01_02(EEPROM_Block0_ADDRESS,EEPROM_WriteAddress2,Tx2_Buffer,BufferSize2); 

  /* Read from I2C EEPROM from EEPROM_ReadAddress2 */
  I2C_SequentialRead_AT24C01_02(EEPROM_Block0_ADDRESS,EEPROM_ReadAddress2,Rx2_Buffer,BufferSize2);

  /* Check if the data written to the memory is read correctly */
  TransferStatus2 = Buffercmp(Tx2_Buffer, Rx2_Buffer, BufferSize2);


  while (1)
  {
  }
}
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

25
 

你说对了,那个程序只能读一次,下次就不对了

当时着急,也没试两次以上的连续读,下面是最终版本的,保证OK,拷贝过去直接用就可以了
#include "stm32f10x_lib.h"

void I2C_AcknowledgePolling(u8 sla);
void I2C_SequentialRead_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len);
void I2C_PageWrite_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len);

void I2C_AcknowledgePolling(u8 sla){
    I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
    do{
        I2C1->CR1 |= CR1_START_Set;
        I2C1->DR   = sla;
    }while(!(I2C_ReadRegister(I2C1,I2C_Register_SR1)&0x0002));

    I2C_ClearFlag(I2C1,I2C_FLAG_AF);
}
void I2C_SequentialRead_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len){
    u8 i;

    I2C_AcknowledgePolling(sla);
    
    I2C1->CR1 |= CR1_START_Set;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
   
    I2C1->DR = sla;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C1->DR = suba;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
               
    I2C1->CR1 |= CR1_START_Set;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  

    I2C1->DR = sla+1;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    
    I2C1->CR1 |= CR1_ACK_Set;

    if(len>1){
        for(i=0;i<len-1;i++){
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
            *pHead ++= I2C1->DR;
            
            I2C1->CR1 |= CR1_ACK_Set;
        }
    }
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
    *pHead = I2C1->DR;
    I2C1->CR1 &= CR1_ACK_Reset;
    
    I2C1->CR1 |= CR1_STOP_Set;
}
void I2C_PageWrite_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len){
    u8 wLen,addr;
    
    wLen=len;
    addr=suba;
    ScrollPage:I2C_AcknowledgePolling(sla);
    
               I2C1->CR1 |= CR1_START_Set;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  
               I2C1->DR = sla;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

               I2C1->DR = addr;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
                              
               I2C1->DR = *pHead++;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
               
               addr++;
               wLen--;
        
    while(wLen){
        if((addr%8)!=0){
            I2C1->DR = *pHead++;
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
            
            addr++;
            wLen--;
        }
        else{
            I2C1->CR1 |= CR1_STOP_Set;
            goto ScrollPage;
        }
    }
    I2C1->CR1 |= CR1_STOP_Set;
}
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

26
 

谢谢楼主!

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

27
 

楼主,有结果没有呀?

                                 我最近也要用,关注中......
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

28
 
楼主 这个程序里面有很多while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
这样的死等,如果有一次eeprom没有应答,程序就死那里了,我原来用24c04用这个程序还可以,现在换成24c02经常在写的时候进入死等状态。
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

29
 
                                 你可以在死等的时候加超时判断呀,事实上我的应用里没加超时判断,从没碰到过死等的时候,如果死等了,说明STM32出问题了,最后一步还有狗看着
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

30
 
                                 很有参考价值,谢谢了
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

31
 
                                 尽量用st原带的库
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

32
 
用中断的要好多了,
用扫描方式的时候,如果硬件上出了一点问题,程序就死在里面了,别的功能也实现不了了。
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

33
 
                                 读和写之间要有延时
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

34
 
                                 有例程建议先调例程,然后再在例程的基础上改
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

35
 
                                 垮了两年的帖子了……该结了
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

36
 
                                 好帖
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

37
 
                                 读和写本身就需要时间,不需要延时太长时间
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表