小学生
最后登录1970-1-1
在线时间 小时
注册时间2021-10-25
|
STM32的I2C硬件的确难玩,I2C2没反应,I2C1发送读取命令,居然会自动读取第一个字节内容,也就是第一个内容在发送读取命令时就莫名其妙的出来了,全程没有半个I2C_ReceiveData函数调用,实际永远无法读取!!,因为发送读命令时就飞掉了!!但是类似代码,发送写命令完全正常,如下图:
代码如下,哪位高手看下哪里除了问题?
====================================
#include "stm32f10x_i2c.h"
int main(void)
{
RCC->APB2ENR |=1<<2;
RCC->APB2ENR |=1<<4;
GPIOA->CRH &=0xFFFFFFF0;
GPIOA->CRH |=3;
GPIOA->BRR=1<<8;//点亮LED0
GPIOC->CRL &=0xFF0FFFFF;
GPIOC->CRL |=8<<20;
GPIOC->BSRR=1<<5;
RCC->APB2ENR |=1 | (1<<3);//开启GPIOB,AFIO时钟
RCC->APB1ENR |=1<<21;//打开I2C1时钟
//设置PB6,PB7为复用开漏输出
GPIOB->CRL &=0x00FFFFFF;
GPIOB->CRL |=0xFF000000;//复用开漏输出
I2C_InitTypeDef stru;
stru.I2C_Ack=I2C_Ack_Enable;
stru.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
stru.I2C_ClockSpeed=200000;
stru.I2C_DutyCycle=I2C_DutyCycle_2;
stru.I2C_Mode=I2C_Mode_I2C;
stru.I2C_OwnAddress1=0x00;
I2C_Init(I2C1,&stru);//初始化I2C硬件
I2C_Cmd(I2C1,ENABLE);//启动I2C硬件
u8 key=1;
while(1)
{
if ((key==1) && (!(GPIOC->IDR & (1<<5))))
{
key=0;
I2C_GenerateSTART(I2C1,ENABLE);//发送开始信号
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
//发送从设备物理地址(读取)
I2C_Send7bitAddress(I2C1, 0x51<<1,
I2C_Direction_Receiver);
while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//<-----------------------这里似乎就开始读数据了,莫名其妙!!
I2C_GenerateSTOP(I2C1,ENABLE);//发送停止
}
}
}
另外,模拟I2C发送读命令是正常的
|
|