STM32库函数操作I2C读写失败

yyang0514 2015-04-09 06:22:20
芯片:SMT32F103VE
现象:main函数执行到AT24C02_WriteOnebyte(0x8,0xfe); 就死机(无打印输出)。
用开发的例子是能正常工作,用STM32库函数进行操作就无效。
麻烦高手帮我看一下。

#define AT24C02_ADDR 0xA0
#define I2C_Speed 200000

//main函数
int main(void)
{
RCC_Configuration(); //系统时钟初始化
GPIO_Configuration();//端口初始化
USART_Configuration();
NVIC_Configuration();
I2C2_Configuration();
printf("init finish\r\n");
delay_ms(10);
AT24C02_WriteOnebyte(0x8,0xfe);

while(1)
{
printf("test code=%x\n", AT24C02_ReadOneByte(0x8));
delay_ms(1000);
}
}
//I2C 端口初始化
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//I2C 初始化
void I2C2_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;

// I2C_ITConfig(I2C2,I2C_IT_EVT|I2C_IT_BUF,ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2, ENABLE);
I2C_AcknowledgeConfig(I2C2, ENABLE);
}

...全文
647 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyang0514 2015-04-15
  • 打赏
  • 举报
回复
非常感谢各位的帮助吗,我先看一下。在汇报情况。
pathletboy 2015-04-10
  • 打赏
  • 举报
回复
stm32的i2c硬件上是有bug的,可以参考以下这2个解决 http://blog.csdn.net/mcu_hong/article/details/8149311 http://bbs.ednchina.com/BLOG_ARTICLE_2154168.HTM
dceacho 2015-04-10
  • 打赏
  • 举报
回复
一直都是用软件模拟, 硬件读写代码量没减少多少,关键里面太多while,搞不好就死机了
mangoalx 2015-04-09
  • 打赏
  • 举报
回复
这么看比较难。你不能跟踪进去吗?看看死在哪儿了。也可以用示波器检查波形看数据有没有发送,对方有没有ack信号
yyang0514 2015-04-09
  • 打赏
  • 举报
回复


void AT24C02_WriteOnebyte(u8 addr,u8 dt)
{
   while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));   
   I2C_GenerateSTART(I2C2, ENABLE);   //delay(0x1ff); //// Send STRAT condition //// 
   while( !I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) );  /* Test on EV5 and clear it 起始位已经发送 */
   
  I2C_Send7bitAddress(I2C2, AT24C02_ADDR, I2C_Direction_Transmitter); // delay(0x1ff); ////Send 0xA6 for connect ////
  while( !I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) );  /* Test on EV6 and clear it 地址已发送 */ 
  
  I2C_SendData(I2C2, addr);  //delay(0x1ff); //// Send the reg_buffer to write to ////
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));  /* Test on EV8 and clear it 发送缓冲区空 */
  
  I2C_SendData(I2C2, dt);// delay(0x1ff);  //// Send the set_buffer to be written ////
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));  /* Test on EV8 and clear it 发送缓冲区空 (即发完了)*/
  
  I2C_GenerateSTOP(I2C2, ENABLE); //// Send STOP condition ////
  delay_ms(10);
}

u8 AT24C02_ReadOneByte(u8 addr)
{
	u8 RxData;
	I2C_Cmd(I2C2, ENABLE);
	while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
	I2C_GenerateSTART(I2C2, ENABLE);
	
	while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
	I2C_Send7bitAddress(I2C2, AT24C02_ADDR, I2C_Direction_Transmitter);

	while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	
	I2C_SendData(I2C2, addr);  
	
	while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); 
	I2C_GenerateSTART(I2C2, ENABLE);
	
	while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
	I2C_Send7bitAddress(I2C2, AT24C02_ADDR, I2C_Direction_Receiver);
	
	while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
	
	while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED));
	RxData = I2C_ReceiveData(I2C2);
	I2C_AcknowledgeConfig(I2C2, DISABLE);
	I2C_GenerateSTOP(I2C2, ENABLE);
	
	return RxData;
}

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧