最近需要用到I2C控制OLED,想先用硬件I2C试试,这样方便一点。用的是OLED商家的代码,比较简单。6 Q. @* R2 f* b# a
: @' C! A* X5 K7 g1 i' O' z% v
I2C1设置为快速模式,400K。
2 _. j# _3 ]5 T" O
" W: B8 x8 d' q& C7 f
Y$ Z) ?1 ?% t1 cmain函数里只写了初始化和一个显示代码。! V" \( N; ~. m0 _+ s# |/ N1 d
' T/ _: L- A- ?# f. A0 _' O
- MX_GPIO_Init();* m" X* ]6 T1 @3 A6 e
- MX_I2C1_Init();
% x9 o! F1 g2 W+ { - /* USER CODE BEGIN 2 */
0 {9 O" w, |1 R2 S - OLED_Init();) |( C |$ ?/ a( ?. ~; K" p( i+ e
- /* USER CODE END 2 */9 _' H3 e" d# p+ {$ n
3 M9 b& o f, ?- R r8 a- /* Infinite loop */
& Z$ ?( V5 W+ L2 r& ^3 {! ]0 O3 I - /* USER CODE BEGIN WHILE */
7 p8 s0 X7 l' r9 E Y$ I* o - while (1)
% |+ g" A( E( ~2 @ - {) a/ d! w/ d2 ^
- HAL_Delay(10);//延时10毫秒9 L. J* R9 e5 u0 Z4 i; S7 a" o4 U( ~
- OLED_ItoC_Show(34,5,debug1,16);//显示获取的I2C数据
1 |; [" g) q* u* ?! B - debug1++;( }8 `3 [' G9 U9 L/ j% C- |
- /* USER CODE END WHILE */6 u6 z0 m2 o, L# j
' B- m4 Q% p0 I, ?2 _9 _- /* USER CODE BEGIN 3 */4 v% ^2 a/ e" h% ?1 D
- }
复制代码 & A9 x8 k, |* D" P J/ \2 T% l
8 l C/ e4 ~- t要注意I2C的SCL,SDA IO口是否一致
% X9 e& k x% Z; ~+ a0 W( v9 Z4 k
- q- g! i& a/ u2 ~* f# c2 m- //初始化SSD1306 ( I: y) M9 G5 d4 O( g; [& d
- void OLED_Init(void)
3 L) T# X( \+ L8 c( u; V - {
5 g: g: M' }6 O+ B/ ^. G S - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
& V6 c! \3 j% W - 2 t, t1 N7 Z2 k8 M! s4 l
- HAL_Delay(800);//必须要延时
复制代码
( ]' @$ k- T* f: c
# @0 [5 F, M0 m( Z8 z$ u用这个HAL库函数(HAL_I2C_Mem_Write)进行I2C的写入操作
, E$ d8 s! s" Y+ a0 J$ n- /*8 [5 z1 K3 w" S- s4 N8 k% H/ y
- * 函数功能: 通过硬件I2C向OLED写入命令或数据: M7 z2 z8 t* h/ `* b5 \/ R2 n7 @) K
- * 输入参数: dat 数据,cmd 命令
" w$ O* V* j! r Q, f - * 返 回 值: 无
& X# T7 W' n, Y. O+ m: |7 @8 { - * 说 明:无
' H7 c& t2 B( ?( ~- @ - */3 ^$ d" f8 z; Y5 Z0 z. f: \
- void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
" B7 n8 L, b: {! m U' ? - {
% B9 ?$ R1 [" P6 T* P J4 L - if(cmd) {HAL_I2C_Mem_Write(&hi2c1,OLED_SLAVE_ADDRESS,OLED_dat_ADDRESS,I2C_MEMADD_SIZE_8BIT,&dat,1,I2C2_TIMEOUT_MAX);}& J, R$ i: q' c9 }( o6 L: M8 Y3 m
- else {HAL_I2C_Mem_Write(&hi2c1,OLED_SLAVE_ADDRESS,OLED_cmd_ADDRESS,I2C_MEMADD_SIZE_8BIT,&dat,1,I2C2_TIMEOUT_MAX);}5 J8 g& K1 y. M8 b H9 L& n* n
- }
复制代码 . D0 X: H# k1 r+ Z- C8 w
7 X3 @ F' U8 h5 V% [
# b2 {# B5 H& S3 _+ U. ] |