小学生
最后登录1970-1-1
在线时间 小时
注册时间2021-11-4
|
尝试了好几天了,i2c依旧是有问题(我的板子是F103)
我自己的程序的main是写1字节数据,再读1字节数据,再写1字节数据,中间没用检查就绪的函数,(一用就卡死),于是我加了个超长的延时,应该足够eerpom就绪了。i2c的代码写在后面吧。
uint8_t date;
bsp_i2c_init();
bsp_i2c_at24c02_writebyte(0x01,0x11);
date = bsp_i2c_at24c02_readbyte(0x01);
bsp_i2c_at24c02_writebyte(0x01,0x11);
先来说说总体情况吧,跑一次我自己的程序,程序能运行到第二个读数据,但此时i2c就卡死了。复位,起始信号也发不出去。
尝试野火的例程,硬件i2c,发现还是卡死,起始信号也发送不了。复位,起始信号还是发送不了
尝试野火的软件i2c,卡死,显示超时。复位,实验成功。
这个时候i2c好像又好了,尝试硬件i2c的例程,没问题,成功运行。复位,还是成功运行了。之后怎么复位都可以成功运行。
总结了一下,好像跑一次我自己的程序就会让i2c失效,但跑两次软件模拟又好了。
于是乎我利用这个特性,跑两次软件模拟来进行复位,试了好几次,读取函数这里禁用应答和使用应答这里改了好几次,都没成功。第二个写函数这里检查总线一直处于忙。实在搞不明白了,就上来问了。。。
之后是我的i2c代码,没有用到宏。
void bsp_i2c_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
I2C_InitTypeDef I2C_InitStruct;
//打开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//打开GPIO
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; //pin6
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; //pin7
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
I2C_DeInit(I2C1);
//打开i2c
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress =I2C_AcknowledgedAddress_7bit ;
I2C_InitStruct.I2C_ClockSpeed = 400000;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2 ;
I2C_InitStruct.I2C_Mode =I2C_Mode_I2C;
I2C_InitStruct.I2C_OwnAddress1 = 0x02;
I2C_Init(I2C1,&I2C_InitStruct);
I2C_Cmd(I2C1,ENABLE);
}
void bsp_i2c_at24c02_writebyte(uint8_t address,uint8_t date)
{
uint32_t i=4000000;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) ;
//发送起始信号并检测
I2C_GenerateSTART(I2C1,ENABLE );
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT )==ERROR);
//发送地址和读写
I2C_Send7bitAddress(I2C1,0xA0,I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED )==ERROR);
//发送数据地址
I2C_SendData(I2C1,address);
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED )==ERROR);
//发送数据
I2C_SendData(I2C1,date);
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED )==ERROR);
//发送终止
I2C_GenerateSTOP(I2C1,ENABLE);
while(i--);
}
uint8_t bsp_i2c_at24c02_readbyte(uint8_t address)
{
uint8_t date=0;
uint32_t i=4000000;
//发送起始信号并检测
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) ;
I2C_GenerateSTART(I2C1,ENABLE );
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT )==ERROR);
//发送地址和读写
I2C_Send7bitAddress(I2C1,0xA0,I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED )==ERROR);
//发送数据地址
I2C_SendData(I2C1,address);
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
I2C_GenerateSTOP(I2C1,ENABLE);
//发送起始信号并检测
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) ;
I2C_GenerateSTART(I2C1,ENABLE );
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT )==ERROR);
//发送地址和读写
I2C_Send7bitAddress(I2C1,0xA0,I2C_Direction_Receiver);
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED )==ERROR);
//接收数据
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED )==ERROR);
date=I2C_ReceiveData(I2C1);
//发送终止
I2C_GenerateSTOP(I2C1,ENABLE);
while(i--);
return date ;
}
|
|