|
iic.c文件#include "iic.h") q* Q- |4 c3 r #include "delay.h"- q+ o1 J/ l2 q- n: f5 [- y# N) G //IIC初始化 void IIC_Init(void) {- C8 \7 i8 J7 i9 C& V6 O GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); # s, \8 @# }$ b4 }5 r7 i9 V& b GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN|IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //IIC_SCL_PIN|IIC_SDA_PIN推挽输出; b" L% \$ l. x. z: O; w GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; f$ W% n. z; E" n+ U. y GPIO_Init(IIC_GPIO, &GPIO_InitStructure);3 a9 m" G; l3 X3 ^3 S+ H* P9 F9 T GPIO_SetBits(IIC_GPIO,IIC_SCL_PIN|IIC_SDA_PIN); //设置为1 IIC_SCL_H;( j5 f; D, m& i$ Z8 U: E" p, R% Z4 g IIC_SDA_H;/ I5 f4 N( I) x' i5 c } //数据线输出模式 void iic_sda_out(void)2 Z% e3 u$ b# u( i5 b { GPIO_InitTypeDef GPIO_InitStructure; ; Q9 Y, M- h3 a* {' ` GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //IIC_SCL_PIN|IIC_SDA_PIN推挽输出( p" v& S1 C6 O+ v/ Z GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; B. D0 S/ P& z7 W; f3 s GPIO_Init(IIC_GPIO, &GPIO_InitStructure);# B( b3 k! Y: O, J, w( ?( X } / M- ~* @3 B8 @7 n: X6 w" Z //数据线输入模式 void iic_sda_in(void) { GPIO_InitTypeDef GPIO_InitStructure; 0 {5 B q" U t5 L GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN; p9 X2 c4 I* C GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //IIC_SCL_PIN|IIC_SDA_PIN推挽输出$ M+ p+ w3 W0 p GPIO_Init(IIC_GPIO, &GPIO_InitStructure); R$ p' k% S7 L- O }- u2 `6 \& D+ e7 |% T & w1 {. y8 |& c8 ^" j //IIC数据传送启动信号 //SCL为高电平的时候,SDA下降沿 void iic_start(void)6 z/ ], c' a8 z { iic_sda_out(); //SDA线输出+ A1 R5 C6 E5 k# D2 Y* _% N IIC_SDA_H; //SDA为高电平 5 v% F4 q; n1 _; l" Y+ Q IIC_SCL_H; //SCL为高电平 SysTick_Delay_Us(5); IIC_SDA_L; //SDA下降沿3 ^- _# Y5 e+ @" c. b! N7 I SysTick_Delay_Us(6);8 Z$ y& e( o" x V3 V5 Z7 E IIC_SCL_L; . i! p- ~/ I7 f) K }( m- S# Y3 K2 O2 X' r( \/ j6 V% L X% x # }# }: A1 v6 B% W //IIC数据传送停止信号( E: R- F3 r+ j5 w. l //SCL为高电平时,SDA上升沿 void iic_stop(void) {$ h( J& f1 X2 c. I* ]: i9 Z iic_sda_out(); //SDA线输出8 m' q$ h# d6 q IIC_SCL_L; //SDA为低电平/ @. p, k1 ?0 ]4 E5 p; R9 u IIC_SDA_L; IIC_SCL_H; SysTick_Delay_Us(6); IIC_SDA_H; //SCL高电平 SysTick_Delay_Us(6); }( Q7 A' i* V* P1 |! D/ c: R* |2 P : M, Z; G% M: Y$ h' }7 T; ? //应答信号 void iic_ACK(void)3 G) h7 {( x n! K, n' J {$ \" @3 d7 i: w% Z IIC_SCL_L; //SCL低电平! p" S! N/ P$ g" j iic_sda_out();" J+ ^# `; U3 _+ p IIC_SDA_L; //SDA为低电平 SysTick_Delay_Us(2); IIC_SCL_H; //SCL高电平/ i) j5 d1 c S2 r5 T/ @& S SysTick_Delay_Us(5);7 S/ s( a) r, f- C4 J' d IIC_SCL_L; //SCL低电平 }* V# e' i: H2 T& k5 j //非应答信号; V2 J7 _/ c6 ~- C" b* v void iic_NACK(void) {6 E: K6 f. o& I/ N IIC_SCL_L; //SCL低电平. c0 r3 P( F: D8 F, Y3 c iic_sda_out();6 ~: T$ f' m! x' V( _4 W, V IIC_SDA_H; //SDA为高电平1 z: u4 e9 Y d6 U" Q& d4 W8 l% @ SysTick_Delay_Us(2);+ E. e5 `) j& P0 m4 A IIC_SCL_H; //SCL高电平6 { `% w& o \ SysTick_Delay_Us(5); IIC_SCL_L; //SCL低电平: j9 M$ w' G; F8 ~% i/ p } //IIC等待应答 u8 iic_wf_ack(void)& P# e: U: X* E2 W- R { u8 times=0;5 l9 g/ K7 l- e/ G1 t8 T iic_sda_in();//设置SDA为输入模式& W1 |, F" q' s/ V# R IIC_SDA_H; SysTick_Delay_Us(1);% E3 V* N' v2 C9 p+ M+ p IIC_SCL_H;+ n" @/ Q2 l( L SysTick_Delay_Us(1); while(GPIO_ReadInputDataBit(IIC_GPIO, IIC_SDA_PIN))//超时应答判断4 Y+ q+ Z X7 l* b5 y { times++;" X8 h- G' t- W: H) j. f% [4 e SysTick_Delay_Us(1);+ W* e5 _7 x. @. L7 p if(times>250). p% b7 ~7 Y2 w0 q0 B" ~" i' f { iic_stop(); return 1;% Y) m G& z9 U' W3 V } } IIC_SCL_L;' C" L1 m2 r/ X) H: O return 0; J2 L; i) O w: D$ J$ @ }# m) T/ x3 g/ S1 K0 Y //IIC发送数据 void iic_SendByte(u8 txd)/ [ @+ i6 @1 V { u8 i;$ b# @1 q7 _! w$ F3 a& i" S0 ~ iic_sda_out();//设置SDA为输出模式 IIC_SCL_L;. e3 `( `' K8 T: r) r6 \ for(i=0;i<8;i++) { if((txd&0x80)>>7) IIC_SDA_H;6 g! M1 g( `% B else IIC_SDA_L; txd <<=1; {$ I3 `# D# L/ a SysTick_Delay_Us(2); IIC_SCL_H; SysTick_Delay_Us(2); IIC_SCL_L; SysTick_Delay_Us(2); }$ M+ e7 q- D* U. W# z9 M0 |9 ] } //IIC读取数据 u8 iic_ReadByte(u8 ack) { u8 i,Receive=0;) H3 W( O' J( |0 Y iic_sda_in();//设置SDA为输入模式* M1 k& R* x) f6 x( \* V for(i=0;i<8;i++) { IIC_SCL_L;6 c0 s! c& z% F! L& g( { SysTick_Delay_Us(2); IIC_SCL_H; Receive<<= 1;7 g( y/ R" i7 W8 f; |+ i; M, G if(GPIO_ReadInputDataBit(IIC_GPIO, IIC_SDA_PIN))* w" U" ~6 I/ F$ l* d/ A+ ] Receive|=0x01;5 p' b# {+ r+ e$ y SysTick_Delay_Us(1);3 g( Y$ H4 O! {5 W" b; t# q; r }. B% @( G% ?+ [2 [9 X if(ack)4 `5 z0 I4 e. }1 g. ~ iic_ACK();1 s, f* S/ H, X8 {; C else4 ~$ l. Z' m" x+ z+ b* b7 Y iic_NACK(); return Receive;//返回最终读取到的值 } d) G+ H# X" ]& f iic.h文件 #ifndef __IIC_H #define __IIC_H* t: g# _3 z' N, `9 X7 `6 \ #include "stm32f10x.h" #define IIC_GPIO GPIOB5 a3 H& W$ c) [$ j3 y #define IIC_SCL_PIN GPIO_Pin_6, N# H2 y3 r6 |$ _ #define IIC_SDA_PIN GPIO_Pin_7 #define IIC_SCL_H GPIO_SetBits(GPIOB, GPIO_Pin_6), I# z) c% y( W% x8 B. S #define IIC_SCL_L GPIO_ResetBits(GPIOB, GPIO_Pin_6)5 v& `% }* e& I2 d2 p # z% U: p# H- `0 ~1 }' J/ h #define IIC_SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_7) #define IIC_SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_7) void IIC_Init(void);2 P3 d' }0 l9 C. e/ V2 | void iic_sda_out(void);8 y9 N0 k3 H6 |0 I! X void iic_sda_in(void); void iic_start(void); void iic_stop(void); 8 G/ y' `9 C7 s void iic_ACK(void);4 i1 ~4 L) X. X0 J void iic_NACK(void); u8 iic_wf_ack(void);5 a' n: y% Y7 ^ void iic_SendByte(u8 txd);0 H+ h6 x2 ~" H. R# x' x u8 iic_ReadByte(u8 ack); ( K* v S" D/ D, N6 ]; i f #endif mian.c文件 /** ******************************************************************************- m: |$ u3 S1 J( z+ S * @file main.c* y) v$ S; V. ?! W, d: J * @author linchen * @version V1.0 * @date 2019-12-169 ?' W; O& X, o. r8 l& { * @brief AD采集电压值输出至串口、IIC、SPI、 * @pin Rx A10 Tx A9 AD A0 IIC_SCL B6 IIC_SDA B7 PWM B5 * @pin SPI B13(SPI2_SCK) PB14(SPI2_MISO) PB15(SPI2_MOSI)******************************************************************************: d: u- l+ v( k. k! ~ */ #include "stm32f10x.h"; @! h% y7 \1 O3 _% A #include "usart.h"6 k* w+ L! X. j h. `" g #include "delay.h" #include "adc_dma.h"6 P0 [5 C3 [- B5 W" m #include "iic.h"- a; e7 `9 c) N7 F# C# j #include "pwm.h" #include "spi.h" u32 rx1 = 0,rx2 = 0; /**; I# K1 f! P: f* {- d! J/ k9 K * @brief 主函数0 C4 X; g. ~6 p; n * @param 无 * @retval 无; p+ G) x+ _0 j4 \( H1 m8 N( o; ^ */ 3 n1 P' ^9 Q; h8 s/ f1 \; s0 |/ e* v9 B - M! J( w3 P$ ` B int main(void) {0 c8 f9 J: V# k6 j! y r& _ SysTick_Init();//初始化滴答定时器; u B0 D" o- A$ Q7 z( | IIC_Init();//iic初始化2 J$ b* _* ^2 r- |, r( E0 u/ i4 ] USART_Config();//初始化USART 配置模式为 115200 8-N-1,中断接收- s8 F& V/ \: \2 x3 p9 q . a# P0 }$ P% ~2 o0 c+ [7 ^ while(1)% n9 U$ |3 Y9 Z5 r/ Q) F {3 r; n" ?0 Y8 X/ z; Z printf("IIC通信开始!\r\n"); //iic_start();//发送起始信号 b1 A6 T8 {* E. D8 j0 U6 M; M //iic_SendByte(0xA0);//发送从机地址,读数据 1010000(七位地址)1(读数据)9 h1 z7 z* I: z1 k( l0 i //iic_wf_ack();//等待从机应答 iic_start();//发送起始信号 iic_SendByte(0xA1);//从机地址为A0,读数据. g& m; [9 F/ Y5 Z/ Q7 O Y; j iic_wf_ack();//等待应答 rx1 = iic_ReadByte(1);//读第一次数据(16位中的高8位)9 G4 E2 A6 L" i1 w5 \ iic_stop();//发送停止信号 7 u) Z" y, y: I' C ~ iic_start();//发送起始信号 iic_SendByte(0xA1);//从机地址为A0,读数据, w2 o9 V" _; i7 o, \ iic_wf_ack();//等待应答 rx2 = iic_ReadByte(1);//读第二次数据(16位中的低8位)4 N- _& A2 L1 J- e, w w( E2 d* O1 ` iic_stop();//发送停止信号 g6 ], ?4 G5 \! H$ X e7 ?8 q SysTick_Delay_Ms(10);7 N: I1 x# r% h, c' z5 W( {1 A printf("IIC通信结束!\r\n"); if(rx1 != 0 || rx2 != 0)6 S/ _! ]9 ~0 C5 N( Y { printf("收到的数据:%d %d\r\n",rx1,rx2); rx1 = 0; rx2 = 0; }% ~: q @: _6 ~2 O. J else { printf("未收到的数据!"); & s8 `, @8 Z8 I2 Q6 g& [. q; S } SysTick_Delay_Ms(2000); } } |
微信公众号
手机版