
今天测试液晶屏附带的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字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 ![]() 2 d2 }) @8 o6 T6 O2 s5 _. G 初始化:: P; ~' ]6 j: t' ]3 N void I2C_uConfiguration(void)4 l" g8 t$ U5 A9 L% L' Y { I2C_InitTypeDef I2C_uInitStructure;' C0 j/ }5 H, j: A% I GPIO_InitTypeDef GPIO_uInitStructure;( |4 V5 N% V' L- B) N 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);6 y# c2 N; }5 ]& s/ J, N6 p1 } 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; 2 p8 o+ C7 |0 i1 l4 z. C( B GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3; // 10M! W; m9 d1 k! m# c GPIO_Init(GPIOB,&GPIO_uInitStructure);1 ]' L, L4 p) K/ ~ y# I3 G% E. Q I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;0 ` ]& F' M# G" [+ p I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable; I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;' y* w4 Z8 G$ o& t5 a 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);3 O( @, R# i5 Q+ T) k% L; G 5 @9 b, h: F2 Y* [ I2C_Cmd(I2C1,ENABLE);' c# F4 n& L2 F8 `/ e0 @7 j5 y q, ] }/ x; y! L/ r' Y" z0 N2 i) Z 连续读:+ z- W* w/ _) V9 H3 ]: A void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf) {; E' W' p) N$ o INT8U i; while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));: {2 d" _3 x: R! F3 y I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);' I- N+ z; v9 D! ] [ while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1,ReadAddr);9 l6 Y+ T: M& {5 i6 e3 B while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);9 @6 G0 d/ H/ F7 D I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read); for(i=0;i<ReadLen;i++) {% c6 X% B! U9 w8 J+ E* B8 v while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);- P0 U* J: D/ ~" Z" j# I( t: Z ReadBuf[i] = I2C_ReceiveData(I2C1);3 w l( O. l3 s. P; P( A } while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET); } ; u R. G2 D9 Z 字节写: void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data)0 k4 r2 B% u- Z# ^8 L {% l- K! Q6 K# r& a3 l0 t0 D/ z2 O s INT8U i;1 S0 ]: Q' E# Y( A o1 ] ( m6 u+ s* |! s* x8 U while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));# A- f6 W0 p B4 S4 [% M I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);1 Y2 m! g& u" J9 w$ v2 c( w while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1,WriteAddr);4 \% s# y' ?$ e H 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);3 n& u* z; g5 a I2C_SendData(I2C1, Data);! H2 ]+ b# A4 X" Y' l3 _6 I3 h1 \ while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);0 o3 ]0 [! V9 g. q2 k6 K I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);- w; n% o/ G' l% w( M Delay_ms(5);$ P+ f# f0 K3 n4 ~' t, s$ ?" j# ]9 N }/ e9 S% p: X: `7 I8 C ( K- U, A. l" |% n9 [0 O 4 N' s/ v* {) T# {. B6 q: @$ h2 } |
稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢 还没有来得及验证……
见该贴 :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
STM8的 我也是一直用的模拟 一直搞不通 呵呵
共同学习!
正在更新中 嘿嘿