野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16827|回复: 4

自己写了一段I2C的程序跪求大神指导啊!!!急急急!!!

[复制链接]
发表于 2015-4-16 09:36:57 | 显示全部楼层 |阅读模式

以下是小弟自己写了一段I2C的程序    程序大概就是往E2PROM的一个地址里写一个数据在往一个地址里读一个数据出来
可是写子函数没问题,到了读子函数就死在里面了,也不知道自己的程序到底可不可行求大神指导!!!急急急!!!

初始化程序全是按照火哥视频来的  可是程序到读子函数的
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
   printf(" \r\n  ÒѶÁ2 \r\n ");

就死了串口输不错字符了;





#include "EEPROM.H"
#include "chuan.h"
void GPIO_INIT_EEPROM_CONFING()
{
GPIO_InitTypeDef GPIO_INIT;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

GPIO_INIT.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_INIT.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_INIT);
}
void EEPROM_INIT_CONFING()
{
I2C_InitTypeDef I2C_INIT;
I2C_INIT.I2C_Ack=I2C_Ack_Enable;
I2C_INIT.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_INIT.I2C_ClockSpeed=400000;
I2C_INIT.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_INIT.I2C_Mode=I2C_Mode_I2C;
I2C_INIT.I2C_OwnAddress1=0X0A;
  I2C_Init(I2C1,&I2C_INIT);
I2C_Cmd(I2C1,ENABLE);
}
void I2C_INIT1()
{
GPIO_INIT_EEPROM_CONFING();
EEPROM_INIT_CONFING();
  
}
void write_i2c(uint8_t addr,uint8_t data)
{
//·¢ËÍÆðʼÐźÅ
  I2C_GenerateSTART(I2C1,ENABLE);
//µÈ´ýÓ¦´ð
while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)));
//·¢ËÍдÃüÁî
I2C_Send7bitAddress(I2C1,0XA0,I2C_Direction_Transmitter);
//µÈ´ýÓ¦´ð
while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));
//·¢Ë͵ØÖ·
I2C_SendData(I2C1,addr);
//µÈ´ýÓ¦´ð
  while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
//·¢ËÍÊý¾Ý
  I2C_SendData(I2C1,data);
//µÈ´ýÓ¦´ð
  while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
//·¢ËͽáÊøÖ¸Áî
  I2C_GenerateSTOP(I2C1,ENABLE);
//Êä³öÒÑ·¢ËÍ×Ö·û
  printf(" \r\n ÒÑ·¢ËÍ \r\n ");
}
int read_i2c(uint8_t addr)
{
uint16_t temp;   
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008   
   
   I2C_AcknowledgeConfig(I2C1, DISABLE);
  /* Send START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  //*((u8 *)0x4001080c) &=~0x80;
  
  /* Test on EV5 and clear it */
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
printf(" \r\n  ÒѶÁ1 \r\n ");
  /* Send EEPROM address for write */
  I2C_Send7bitAddress(I2C1, 0XA0, I2C_Direction_Transmitter);
  /* Test on EV6 and clear it */
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
   printf(" \r\n  ÒѶÁ2 \r\n ");
  /* Clear EV6 by setting again the PE bit */
  I2C_Cmd(I2C1, ENABLE);
  /* Send the EEPROM's internal address to write to */
  I2C_SendData(I2C1, addr);  
  /* Test on EARM and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  /* Send STRAT condition a second time */  
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  
  /* Send EEPROM address for read */
  I2C_Send7bitAddress(I2C1, 0XA0, I2C_Direction_Receiver);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

   temp=I2C_ReceiveData(I2C1);


   I2C_GenerateSTOP(I2C1,ENABLE);
printf(" \r\n  ÒѶÁÍê \r\n ");
return temp;

}

回复

使用道具 举报

 楼主| 发表于 2015-4-16 09:39:10 | 显示全部楼层
输出和注释用的中文所以复制过来字符全乱掉了  大神请自动忽略注释和输出的字符
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-16 09:59:31 | 显示全部楼层
哭死了主程序加一个延时就好了,也是蛋碎了!!!看了2天
回复 支持 反对

使用道具 举报

发表于 2015-4-16 10:01:58 | 显示全部楼层
STM32微控制器的勘误手册对I2C总线接口有这样一段描述:如果没有在传输当前字节之前处理EV7、EV7-1、EV6-1、EV2、EARM、和EV3事件,有可能产生问题,如收到一个额外的字节、两次读到相同的数据或丢失数据。硬件I2C接口存在工作不稳定现象,如经常出现传输失败或陷入死循环,原因是STM32的硬件I2C时序不能被中断。ST公司给出了暂时的解决办法,建议使用I2C的DMA模式,除非作为主设备时只接收一个字节;或者使用I2C的中断并把它的优先级设为最高级别,使得它不能被中断。
简单的说就是硬件I2C不稳定,有bug。建议改为软件I2C
希望能帮到你哈 我当时也是纠结的要死
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-16 10:39:53 | 显示全部楼层
wakaka 发表于 2015-4-16 10:01
STM32微控制器的勘误手册对I2C总线接口有这样一段描述:如果没有在传输当前字节之前处理EV7、EV7-1、EV6-1 ...

是的呀卧槽超不稳定的只要稍微改一点东西就读写不了还会死循环,大神谢谢!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-4 18:16 , Processed in 0.055526 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表