|
硬件IIC配置如下: ) U+ _: N. z9 j1 H main.c文件% x. I, Q- l0 l$ X, k& K4 P #define SLAVE_ADDR 0xA0 //该从机地址 #define I2CSPEED 100000 //i2c速度5 R6 ?* z4 N# J6 M! P /******************************IIC从机初始化******************************************************/ void IIC_INIT()8 U/ `9 B c' b& }6 Z {: S, z7 x2 c) t d& ~1 y I2C_Init(I2CSPEED, SLAVE_ADDR , I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);//I2C初始化& P6 V7 _# a3 q3 U I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE); //100K速率,16位自身地址,占空比=2,应答当前字节,从模式地址长度 //8位输入时钟频率 //I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);+ l" |1 ~& p5 U, I //I2C_Cmd(ENABLE);//开启IIC } int main(void)7 L/ N S6 z( S, m" ^4 p5 f3 o {2 z$ y, Z2 y: z. y4 G( @ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟初始化(不分频)时钟为1分频16M 2分频8M IIC_INIT();//iic初始化5 r! j/ Z/ b5 m9 G1 o enableInterrupts();//中断使能开启7 k* S$ M% ~, v 2 o. I) f4 r B! a1 x& y while(1)$ H1 e( W1 R; P2 Z {/ W7 C V( x" E' m) B ; }1 a& k9 i1 Y" ~: Q$ G }( @& I7 ^1 n( B5 ?; N. T( c* D ) r5 { n: ]# [. a Z: t9 F stm8sit.c u8 count = 0;5 P, S7 d0 `9 N 3 @* F5 B- A/ E9 j* W 6 Z# j; m- L+ X: E5 l( D4 t% x1 N , J9 v/ X- t3 Q INTERRUPT_HANDLER(I2C_IRQHandler, 19)7 t I) t$ {5 Q% Y# j. ]( k) W { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */! U. d8 p8 O8 C) l& ^* a3 c: U /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ //接收发送 //printf("DHT11!\r\n"); /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction.3 m1 ^7 m4 T g4 \0 u */ //接收发送 u8 temp = 0; if (I2C->SR1&0x02)//地址已经匹配(读SR1,SR3清除该位)! }1 {) E* @" e1 U3 h5 O { I2C->SR3&0x07; N3 H' C. h2 O/ q ++count; if(count == 1)3 C3 q( B L7 r2 ?- l+ J+ H {7 _5 M) I/ U* A+ L/ @8 g I2C->DR = 0x11;//主机第一次读该从机,该从机发送0x114 S: \; @2 [7 g2 Y" E } else if(count == 2)9 b9 N9 b1 w* V f8 N { I2C->DR = 0x22;//主机第二次读该从机,该从机发送0x22 count = 0; } } else if ((I2C->SR1&0x84)&&(I2C->SR3&0x04))//数据字节传送完 {' f; c8 |' ]% Z8 u //temp = 0xA5; //假设这里发送0xA5 1 m" l- r @) L) b% q' j } else if ((I2C->SR1&0x40)&&(0 == (I2C->SR3&0x04)))//接收时数据寄存器- h1 N0 p a# Y" w$ c { temp = I2C->DR; //读取数据寄存器 1 @( {7 s, B# d$ D+ ?, C } else if (I2C->SR1&0x10)//检测到停止位! ^+ y7 _$ j, e; u" K- ~0 X: d { {8 n" V' M% c' \ I2C->CR2 = I2C->CR2;//清除停止位2 W8 E4 _# A$ X, G, j* F3 [, w0 | }9 F, o$ c& b# j1 _' q: B //错误处理5 S0 [3 u n. r' W, U, _/ }/ \ { if (I2C->SR2&0x01)//总线错误 {9 f$ X5 t; f2 ~3 P. n I2C->SR2 &= ~0x01;//清零& x, @; f8 g" ]) M/ Z. ?, C" `) G }# ]2 Q) M2 o; L3 o2 m- Q+ V6 i, C) F else if(I2C->SR2&0x02)//仲裁失败 {' O2 }: v8 f& O3 N) e& b' P I2C->SR2 &= ~0x02;//清零 }2 A3 p! W9 Z* @9 r# A/ E* o else if(I2C->SR2&0x04)//应答失败 { I2C->SR2 &= ~0x04;//清零+ c) E& Z# D$ F7 [ I }6 K5 W& ]6 @& A9 y; B9 B. T) i else if(I2C->SR2&0x08)//上溢、下溢7 ~3 B0 r! |1 N* ^% S* X { I2C->SR2 &= ~0x08;//清零) Q" W" {$ \, B$ Y2 K }/ Y; Q$ u) t: f! t/ ^* p% f0 S9 y return; }2 f0 b6 ^ o0 N, `8 c8 c, p6 C( D7 _ 主机读取步骤见附件 |
STM8自学笔记(推荐STM8很好的入门电子书)
无刷直流电机控制应用+基于STM8S系列单片机---电子书
【精华资料】STM8Sxx固件库FOR IAR
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
微信公众号
手机版