24C256读写失败
24C256读写失败
程序停止在了while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
测试i2c引脚都为低电平
//------------------------EEPROM 24C256 API---------------------------
void GPIO_I2c_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;
//CLOCK
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
//-----------------------------------------------------------
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void I2C_24c256Init(void)
{
I2C_InitTypeDef I2C_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_I2c_Init();
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_ClockSpeed = I2C_Speed;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
//
I2C_InitStruct.I2C_OwnAddress1 = I2C_Slave_Adress7;
I2C_Init(I2C1,&I2C_InitStruct);
I2C_AcknowledgeConfig (I2C1,ENABLE);
I2C_Cmd(I2C1,ENABLE);
}
void I2C_24c256ByteWrite(u16 WriteAddr,unsigned char Byte )
{
NVIC_SETPRIMASK();
// Start the I2C
I2C_GenerateSTART(I2C1,ENABLE);
//not recommanded, stupid way
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,EE24C256_ADDW,I2C_Direction_Transmitter);
// when get ACK, means Set Success
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//------------------------------地址高位
I2C_SendData(I2C1, (WriteAddr>>8));
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//------------------------------地址低位
I2C_SendData(I2C1, WriteAddr);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, Byte);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE);
NVIC_RESETPRIMASK();//开中断asm("CPSIE I");
}
void I2C_24c256ByteRead(u16 WriteAddr,unsigned char *Byte )
{
NVIC_SETPRIMASK();
// Start the I2C
I2C_GenerateSTART(I2C1,ENABLE);
//not recommanded, stupid way
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,EE24C256_ADDW,I2C_Direction_Transmitter);
// when get ACK, means Set Success
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//------------------------------地址高位
I2C_SendData(I2C1, (WriteAddr>>8));
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//------------------------------地址低位
I2C_SendData(I2C1, WriteAddr);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_Send7bitAddress(I2C1,EE24C256_ADDR,I2C_Direction_Transmitter);
// when get ACK, means Set Success
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
*Byte = I2C_ReceiveData(I2C1);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
I2C_GenerateSTOP(I2C1, ENABLE);
NVIC_RESETPRIMASK();
}
硬件没有问题,我使用模拟i2c的方法可以正常的读写
查看寄存器 busy 一直为 1
busy状态位当然为1咯
因为总线电平都是低,只要一使能I2C模块的时钟,BUSY@SR2马上被硬件置位。这样的话,再想进行I2C通信,当然不能成功。
请用置顶帖子中2楼的那个。
谢谢
谢谢
我主要是想知道我怎么错了,错在哪了??
呵呵
也许大家没有时间帮我看
通信之前要保证
1。总线电平都处于idle状态,高电平
2。I2C的两个状态寄存器的状态值正确,一般应该都为0
回 通信之前要保证
我的状态是
I2C的两个状态寄存器的状态值正确,都为0
总线电平都处于低电平,有上拉,不知为何故?
把24c256焊掉状态为高
24c256和硬件电路是正常的我用模拟i2c的方法可以正常的读写
总线电平都处于低电平是不对的,这时I2C不能工作
好像你的24C256有问题。
回好像你的24C256有问题。
我用模拟i2c的方法可以正常的读写,24c256就没有问题了吧
通信之前的总线电平问题
我很奇怪,I2C通信之前,跟后来用GPIO模拟还是用软件库没有关系,问什么一个情况下是总线正常电平,一个情况下总线电平不正常呢?
平常是高电平
一看到I2C的贴就很郁闷~
STM32设计 IC2 部件的那个设计师正是个SB!
我问你
I2C通信之前,跟后来用GPIO模拟还是用软件库没有关系,问什么一个情况下是总线正常电平,一个情况下总线电平不正常呢?
I2C通信之前总线就变低,为什么会与I2C程序有关呢?
程序还没有运行,怎么能怪程序呢?
还要确定两件事
第一,是一上电,还是I2C通信了一段时间后,总线电平不正常;
第二,到底是STM32还是24C256拉低了总线电平。
回楼上几位
I2C_24c256Init()
之后电平就变低了,电平是被24c256拉低了
改变I2C_Speed后有时会影响,使电平变高,再改变又会死掉
偶尔可以执行到I2C_24c256ByteWrite(u16 WriteAddr,unsigned char Byte )中的while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
有时可以执行到I2C_24c256ByteRead(u16 WriteAddr,unsigned char *Byte )中的 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
通信之前的电平问题
就是说,板子一上电,电平还是正常的;执行了I2C_24c256Init()电平被外部的24C256拉低?
那么,
1。进入I2C_24c256Init()函数,看看哪句话使得电平变低的;
2。使用置顶帖子里的2楼方法,也会这样么;
通信之前的电平问题
我这上电之后就被拉低了
偶尔是高的,没有初始化的时候就已经是低了,初始化之后还是低,外部有上拉
是开漏的引脚
我想一定是被24c256拉低了
出错时复位一下MCU
出错时复位MCU,别松手直接量该点电平,就知道MCU是否在拉低这根线