|
今天测试液晶屏附带的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字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 9 Z: q' E* Y! E* v; c+ Q6 p/ _/ J初始化: void I2C_uConfiguration(void)2 `/ j# ` b3 l" M- A { I2C_InitTypeDef I2C_uInitStructure;, ]% W @9 B3 ^2 J6 @) t GPIO_InitTypeDef GPIO_uInitStructure;: |% u: g, N$ W+ a# i9 V RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK); 0 `6 S b7 C, J RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);3 m; K$ y0 G) S2 e- ~" q& X - c, P0 j* c$ q$ b% S9 V // I2C1_SCL -> PB8 // I2C1_SDA -> PB90 GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);5 b$ W* y% A! D8 Q& i: Z7 _8 g 4 [' M( g1 ^2 |( i8 l6 W' F3 A GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;: f* V B* y. U# ^" _6 v7 u/ Q5 g GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP; 2 g" d7 x5 D7 y. B& h6 } GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3; // 10M8 i/ m! R. o. _- C# m0 J GPIO_Init(GPIOB,&GPIO_uInitStructure);! z0 \* f& b3 f- Y& v% Y- g2 P9 x, b , d6 {$ ]. Z3 G$ d/ B! B/ U I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C; S6 K* m# [" }- j5 \' R& p$ v 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;3 A# J; q3 {8 u: y6 I( D9 @ I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1,&I2C_uInitStructure);1 m5 U1 @1 [% F+ b6 o: h, o8 A I2C_Cmd(I2C1,ENABLE); }+ K H; I1 g0 K. n: ^ z 连续读: 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);/ w8 v, x; Q/ ? while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);; l/ {( y6 s8 ~ I2C_SendData(I2C1,ReadAddr);/ g5 C; x4 P* Z4 B 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++)/ y2 ~. K- c0 L) ]8 n { while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET); ReadBuf[i] = I2C_ReceiveData(I2C1);6 v* q2 t) t. R }, t( z4 R3 {. J( w' @ while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);3 Z" [, r+ l0 s+ q4 g5 L } & l. L8 O" W3 b, E) O1 h 字节写: void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data) {4 a/ b4 }% [0 a' l INT8U i;5 H0 P' Q, V( i/ O9 @ 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);$ p( W% p, n& d I2C_SendData(I2C1,WriteAddr);: A7 ^* M7 c% [# C2 H7 C" N7 Y while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);" p/ L. h" Z2 M: w 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);! P: N. f( Q9 u: r M Delay_ms(5);3 r2 w0 j/ e, r1 L }9 r% d/ F) E& \& Y$ H: d: k8 A7 ~ ) u- a" r8 T$ T$ s8 u0 \1 b 1 i. I3 D' r+ ~& b+ `, Y7 o0 l' h7 k) a7 ] 8 Q7 D% S6 T5 \ } |
微信公众号
手机版
稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢 还没有来得及验证……
见该贴 :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
STM8的 我也是一直用的模拟 一直搞不通 呵呵
共同学习!
正在更新中 嘿嘿