
今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。8 l. o) a+ o; b; H7 H; |+ ^ 直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 ![]() 初始化: void I2C_uConfiguration(void)0 r! Z5 a/ Q: v! `* ?7 N: ~$ C. i { I2C_InitTypeDef I2C_uInitStructure; GPIO_InitTypeDef GPIO_uInitStructure;1 ?( P$ A6 ^. j RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);! m: x$ a$ c" k9 p3 ` RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); 1 l/ Z! f4 J0 \+ R // I2C1_SCL -> PB8 // I2C1_SDA -> PB90! h1 g) b% a7 }) N GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1);9 @; h' j$ I" f GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1); GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;3 ^3 N' P, m+ H# }7 D GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP; ) \# e. _# N* G5 x ]* |, i1 r GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;! Y9 t) v( ^. N' h; D3 _5 a% c! u$ V GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3; // 10M GPIO_Init(GPIOB,&GPIO_uInitStructure);' {" n# L9 Z D3 E2 w0 x 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;' p# R1 B1 b6 i2 @, o I2C_uInitStructure.I2C_OwnAddress1 = 0;$ I" G2 C" }3 p! k/ Z2 G+ @- D I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1,&I2C_uInitStructure); I2C_Cmd(I2C1,ENABLE); }1 ?6 I# }6 f0 J+ i" t8 n/ q! { - i, _% o# y& _( @) U: i/ W3 Q 连续读:. y. k0 Q9 B; x+ Y" v; _" |) |2 M4 z void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)0 j/ R% x) B* X+ u { INT8U i; while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)); I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);0 d0 g# j) A# o& ?" s7 | while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1,ReadAddr);1 g4 V, Y2 V2 H- v while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);9 I# T; B6 |( N2 N I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);/ [4 ^! V K, h7 Y [ for(i=0;i<ReadLen;i++)4 u- }. s, A: B6 E. } {3 |, V( z" M: l3 K' @ while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);; k( h1 z& Q, H ReadBuf[i] = I2C_ReceiveData(I2C1); } while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET); } 字节写:1 e! ~7 q8 g9 Q% u9 r void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data) {* z ?7 J( Z6 d INT8U i;( c. n6 G" F* t 0 a% U& [! W8 \# `( y& q e3 Q$ T while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)); I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);+ \0 P+ l1 z! ~' t$ J# N 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);1 D# {3 |3 p% ^+ a" s5 l Delay_ms(5); } 2 x5 z9 v% w* s. F$ y d 4 |: S+ J: O5 ` * P+ N" L8 H6 \ 9 F; a$ y2 m5 N1 i& S |
稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢 还没有来得及验证……
见该贴 :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
STM8的 我也是一直用的模拟 一直搞不通 呵呵
共同学习!
正在更新中 嘿嘿