你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8s单片机从机硬件IIC程序代码(主机为STM32)

[复制链接]
linchenchen 发布时间:2019-12-25 15:42
硬件IIC配置如下:
- q- u3 C/ }1 n9 s) U+ _: N. z9 j1 H
main.c文件% x. I, Q- l0 l$ X, k& K4 P
#define SLAVE_ADDR 0xA0  //该从机地址
4 r, p. J9 r7 K0 ?2 l#define I2CSPEED 100000 //i2c速度5 R6 ?* z4 N# J6 M! P

! ]& K: E+ N  s- z2 ]
# q9 o; \: c+ D  y/******************************IIC从机初始化******************************************************/
& r: j9 G/ J5 Y) P6 a& W; E! Kvoid 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);
, t/ a. x( f& T0 ?2 Y        //100K速率,16位自身地址,占空比=2,应答当前字节,从模式地址长度
- @1 k1 i% ]1 p; Y        //8位输入时钟频率
3 i8 t& `/ w$ J) S0 m% e4 G. \        //I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);+ l" |1 ~& p5 U, I
        //I2C_Cmd(ENABLE);//开启IIC               
3 {& ]* A- B) e1 t( N) s+ A9 P}
0 e3 N* S8 G) `- Y
& L: u$ F# g# w5 ]! X
+ @$ |! g+ }: O! g$ s- D( nint 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
' `5 R0 P! V& f& v  q     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
             ;
/ p6 W( ]1 T+ c- ?7 d6 ^) s3 t    }1 a& k9 i1 Y" ~: Q$ G
}( @& I7 ^1 n( B5 ?; N. T( c* D

4 |9 I7 n) Z1 }; ?* B6 Q) r5 {  n: ]# [. a  Z: t9 F

9 c  l6 i, a$ W5 y' o- [stm8sit.c
' o  l/ x8 m7 t  Ru8 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
{
: a* j  n0 D+ x  /* In order to detect unexpected events during development,
% @  E+ u4 {( F     it is recommended to set a breakpoint on the following instruction.
+ g: T7 ?3 p) K" m: r  */! U. d8 p8 O8 C) l& ^* a3 c: U
    /* In order to detect unexpected events during development,
! A- I3 @7 {0 a( P, u2 t     it is recommended to set a breakpoint on the following instruction.
4 H/ Y$ Z8 J' v% s4 w: B9 x  */
7 J8 ~/ `' j' O( J( ~//接收发送
4 [. ^, F% }& D    //printf("DHT11!\r\n");
) t" G6 k. p- p9 ?; L% O5 F& e; V  /* In order to detect unexpected events during development,
1 {, c" i* ?- k$ ^5 C4 q: R  p7 D     it is recommended to set a breakpoint on the following instruction.3 m1 ^7 m4 T  g4 \0 u
  */
  S7 n; _2 U. g) }//接收发送
' o2 m+ U! l$ p9 m" t9 y. }$ I    u8 temp = 0;
+ A8 ]  u  y' {6 s% e  @; X+ B3 T4 j    if (I2C->SR1&0x02)//地址已经匹配(读SR1,SR3清除该位)! }1 {) E* @" e1 U3 h5 O
    {
* _. N+ W; h; i& L7 t, v+ F% R        I2C->SR3&0x07;  N3 H' C. h2 O/ q
        ++count;
; ?/ J  U. v7 |7 f+ M: L8 H8 }% N        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
        }
8 J) W% q5 Q1 @; K% H2 g2 o        else if(count == 2)9 b9 N9 b1 w* V  f8 N
        {
8 T. n# W1 m) f# c" z3 M( x5 r          I2C->DR = 0x22;//主机第二次读该从机,该从机发送0x22
7 e9 M0 n, d5 C, }/ w6 {4 q; f          count = 0;
4 D1 t7 Z3 A) C        }
/ G) S  R2 d) B/ Q: C: x" ~+ W9 @    }
( N/ \* ^! ]2 h2 u    else if ((I2C->SR1&0x84)&&(I2C->SR3&0x04))//数据字节传送完
0 [, a0 L9 \1 g- M    {' f; c8 |' ]% Z8 u

. a1 O0 i/ R/ T- P, o        //temp = 0xA5;    //假设这里发送0xA5
9 ~" y. q- @, E$ _5 B/ X1 m" l- r  @) L) b% q' j
    }
$ q' X* ^3 |+ l. ]    else if ((I2C->SR1&0x40)&&(0 == (I2C->SR3&0x04)))//接收时数据寄存器- h1 N0 p  a# Y" w$ c
    {
# ]- p' x- q' G) ^- }        temp = I2C->DR;    //读取数据寄存器
7 C/ I% Z/ M& L* g/ B1 @( {7 s, B# d$ D+ ?, C
    }
2 Y+ f  j" ]) Q7 Y) Z    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)//总线错误
5 L& ?+ j7 {4 K+ N5 o' \    {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)//仲裁失败
2 G2 {) i" @2 K3 u' d    {' O2 }: v8 f& O3 N) e& b' P
        I2C->SR2 &= ~0x02;//清零
+ E3 B% a$ X8 S6 r5 ^4 }* |& C    }2 A3 p! W9 Z* @9 r# A/ E* o
    else if(I2C->SR2&0x04)//应答失败
6 s! W# I3 U' K$ E( K    {
  H, ~$ `0 A, O1 M# A- M5 s        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
    {
7 @! Y* i3 T7 S& @. L5 p4 {        I2C->SR2 &= ~0x08;//清零) Q" W" {$ \, B$ Y2 K
    }/ Y; Q$ u) t: f! t/ ^* p% f0 S9 y
    return;
8 {0 a+ U  Z( \) |* x; ?8 G4 ~}2 f0 b6 ^  o0 N, `8 c8 c, p6 C( D7 _

0 o. L# d2 I9 L6 ^8 N2 a5 M2 a1 V
$ k/ q3 m! _6 O1 p, C: k' o& I$ _8 _
" D2 M7 \& J# Z6 T' m$ k  C主机读取步骤见附件
' B5 }1 x6 l3 ^# ?
QQ截图20191225154055.png
赞 收藏 2 评论0 发布时间:2019-12-25 15:42

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版