
今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。! Z! h, ~- }8 u 直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 ![]() * Y' C' T% v, |3 [7 n( Z6 k; | T 初始化:* D0 C( q5 U4 i* G& p void I2C_uConfiguration(void) { I2C_InitTypeDef I2C_uInitStructure;! u( k, @) f+ [ h) h4 C+ i; n GPIO_InitTypeDef GPIO_uInitStructure; $ t9 w" Q+ M5 T* R& p; C2 R RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK); 2 J3 @' G" j) A RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); 7 C- g. L9 g) }! m* X# ~9 `2 P5 F // I2C1_SCL -> PB8 // I2C1_SDA -> PB90 GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);( Z0 f2 q6 ], q ! |% V+ e( i5 x7 b0 Z, W$ J, ? |+ Z GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;4 Q) `7 ?1 [, A( s' P GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP; 9 j* F1 r5 s; H& Y5 } GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;8 g Q' G# M2 }" a2 b GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3; // 10M& {. W" b8 y' m2 F GPIO_Init(GPIOB,&GPIO_uInitStructure); I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;4 ~1 s0 K$ Z6 E5 e# ]- Y( ~ I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;: \; K1 ^+ ]- W2 a- F Q9 L I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; I2C_uInitStructure.I2C_DigitalFilter = 0;4 @4 t8 ^. z$ B+ p I2C_uInitStructure.I2C_Timing = 0x40B22536;2 E% i; I9 F- d7 d' _" l I2C_uInitStructure.I2C_OwnAddress1 = 0; I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1,&I2C_uInitStructure); + Y( d. ]( L% ~/ l h2 b, K4 d I2C_Cmd(I2C1,ENABLE);' j! y5 E7 a# B7 T, y# u }: H. k2 u1 U/ O" H, @9 [6 P8 l - E+ |; O5 p# l4 I% W# Z: K 连续读:3 O1 C b7 ]2 F void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf) {/ |! Q. q4 r) A# q; D% a) U INT8U i;& @; \/ W' T+ r- ^9 u# Q while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));6 Q b# u3 O) H" x. p* c I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);+ C! a( E9 l5 I( o/ T) u" l" \ while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1,ReadAddr);+ R! \+ L ^! }2 r while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);/ i/ b: h. M5 |* s. H$ ?" N I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);/ `* a; @" g) U( T5 e5 \- O9 ^ for(i=0;i<ReadLen;i++)' o! o3 J: J+ ]- w { while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);4 A M) |' w4 g ReadBuf[i] = I2C_ReceiveData(I2C1);+ q7 k- G! J. i. r } while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);( }+ Z# S, M) L p }) h- P8 \4 {/ q # k8 U1 a5 B* ~* P 字节写: void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data) { INT8U i; 3 l8 w' a9 A# L: u' F6 o; V: x 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);* h" |9 Q1 c0 u5 Z! Z# ^ I2C_SendData(I2C1,WriteAddr); ~$ D7 E# B5 y5 N 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);; u% z5 N3 V& n/ U I2C_SendData(I2C1, Data); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET); I2C_ClearFlag(I2C1, I2C_ICR_STOPCF); Delay_ms(5); } 3 o! G( ~7 y. e! O5 ]) ]& @ ) {" r4 k, F1 q2 q* F |
稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢 还没有来得及验证……
见该贴 :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
STM8的 我也是一直用的模拟 一直搞不通 呵呵
共同学习!
正在更新中 嘿嘿