
今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。 直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 ![]() 初始化: void I2C_uConfiguration(void) { I2C_InitTypeDef I2C_uInitStructure; GPIO_InitTypeDef GPIO_uInitStructure; RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); // I2C1_SCL -> PB8 // I2C1_SDA -> PB90 GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1); GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP; GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3; // 10M GPIO_Init(GPIOB,&GPIO_uInitStructure); I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C; I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable; I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; I2C_uInitStructure.I2C_DigitalFilter = 0; I2C_uInitStructure.I2C_Timing = 0x40B22536; I2C_uInitStructure.I2C_OwnAddress1 = 0; I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1,&I2C_uInitStructure); I2C_Cmd(I2C1,ENABLE); } 连续读: void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf) { INT8U i; while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)); I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1,ReadAddr); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET); I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read); for(i=0;i<ReadLen;i++) { while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET); ReadBuf[i] = I2C_ReceiveData(I2C1); } while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET); } 字节写: void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data) { INT8U i; while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)); I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1,WriteAddr); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET); I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1, Data); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET); I2C_ClearFlag(I2C1, I2C_ICR_STOPCF); Delay_ms(5); } |
稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢 还没有来得及验证……
见该贴 :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
STM8的 我也是一直用的模拟 一直搞不通 呵呵
共同学习!
正在更新中 嘿嘿