|
今天测试液晶屏附带的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字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 ' m0 Q( `0 y1 d# I. P初始化:0 y( Y# N9 m- ^, D+ O' e, |0 Q* f void I2C_uConfiguration(void); \5 j7 v5 V2 x# L" {* A1 w { I2C_InitTypeDef I2C_uInitStructure;( p% c1 ^7 H+ n9 E# e/ }$ v+ } K GPIO_InitTypeDef GPIO_uInitStructure;) Q, H/ [. Q; P- D% q7 y+ X+ v+ z/ C RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK); 2 Q0 z- f8 {9 G( C7 T u$ Z RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); # ~& }& S) A0 \9 u- M, U // I2C1_SCL -> PB8 ) @* a0 s% O8 Z0 ]" W3 u // I2C1_SDA -> PB90$ M" S" X( o& V/ Q GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);' }6 ~ g0 ?8 n& h" J# ?6 c0 Z GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; H1 G! t$ ]4 I GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP; GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;( T, j9 [! `- r( h GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3; // 10M6 t" Z* w8 Z$ w9 b. V3 ~- Q% D GPIO_Init(GPIOB,&GPIO_uInitStructure);! i6 d: c2 ^% P2 \! }- Q" o ( m% {! e: c5 h( H# w9 Y I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;- i8 q/ C2 U7 S, ]! i I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;3 \1 r' m5 J: I+ @. n3 Q" M I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; I2C_uInitStructure.I2C_DigitalFilter = 0;# H K4 u, t+ q" y I2C_uInitStructure.I2C_Timing = 0x40B22536; I2C_uInitStructure.I2C_OwnAddress1 = 0; I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1,&I2C_uInitStructure);& H8 b: M0 K* ` I2C_Cmd(I2C1,ENABLE); }; o+ G% ?, D1 H $ s8 Y% r! W5 M+ C! y 连续读:& p- \7 J% e% t) R( U" I void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)+ I2 O" M+ j; m! Q* }3 z' j9 a { INT8U i;( T1 B/ k; g# |, j9 y, h% _ 7 y0 c+ V7 P7 w: m- t 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++)! e$ s @9 M) J9 `2 o { while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET); ReadBuf[i] = I2C_ReceiveData(I2C1); }! o' A9 o6 O! Q7 p! Z while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET); } ; s% M, S: r4 U3 a: A) A1 S 字节写:9 T$ L0 M$ v2 X7 L7 Y void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data) {- V- L4 H: `6 l0 S' V INT8U i; while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));: U1 Z4 E" m! ~5 k, A; V/ L) G, ~ I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);# E% ]6 N, C5 N4 i+ \ while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET); I2C_SendData(I2C1,WriteAddr); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);2 G+ Z W: t! a$ x& \8 y I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop);7 w. t, Q* U( _. { while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);1 u( F$ T! l+ G, B9 W2 [4 A0 h I2C_SendData(I2C1, Data);3 C+ a8 R* Y2 ? while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET); I2C_ClearFlag(I2C1, I2C_ICR_STOPCF); Delay_ms(5);% d; S. y- m$ c* `. h, X } : _7 ]+ N/ `2 n1 F& l( ?! C) ]3 j 8 d% R' \8 `. D" E' ] |
微信公众号
手机版
稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢 还没有来得及验证……
见该贴 :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
STM8的 我也是一直用的模拟 一直搞不通 呵呵
共同学习!
正在更新中 嘿嘿