STM32-IIC

Posted clam-hao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32-IIC相关的知识,希望对你有一定的参考价值。

  1 #include "myiic.h"
  2 #include "delay.h"
  3       
  4 /*******************************************************************************
  5 1.void IIC_Init(void);                //初始化IIC的IO口                 
  6 2.void IIC_Start(void);                                //发送IIC开始信号
  7 3.void IIC_Stop(void);                              //发送IIC停止信号
  8 4.void IIC_Send_Byte(u8 txd);                    //IIC发送一个字节
  9 5.u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
 10 6.u8 IIC_Wait_Ack(void);                             //IIC等待ACK信号
 11 7.void IIC_Ack(void);                                    //IIC发送ACK信号
 12 8.void IIC_NAck(void);                                //IIC不发送ACK信号
 13 *********************************************************************************/
 14 
 15 
 16 /*******************************************************************************
 17 1.函数名称:初始化IIC
 18 2.包含变量:
 19 3.修改日期:
 20 *********************************************************************************/
 21 void IIC_Init(void)
 22 {                         
 23     GPIO_InitTypeDef GPIO_InitStructure;
 24     //RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 
 25     RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOC, ENABLE );    
 26        
 27     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;
 28     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
 29     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 30     GPIO_Init(GPIOC, &GPIO_InitStructure);
 31  
 32     IIC_SCL=1;
 33     IIC_SDA=1;
 34 
 35 }
 36 
 37 /*******************************************************************************
 38 1.函数名称:产生IIC起始信号
 39 2.包含变量:
 40 3.修改日期:
 41 *********************************************************************************/
 42 void IIC_Start(void)
 43 {
 44     SDA_OUT();     //sda线输出
 45     IIC_SDA=1;            
 46     IIC_SCL=1;
 47     delay_us(4);
 48      IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
 49     delay_us(4);
 50     IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
 51 }      
 52 
 53 /*******************************************************************************
 54 1.函数名称:产生IIC停止信号
 55 2.包含变量:
 56 3.修改日期:
 57 *********************************************************************************/
 58 void IIC_Stop(void)
 59 {
 60     SDA_OUT();//sda线输出
 61     IIC_SCL=0;
 62     IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 63      delay_us(4);
 64     IIC_SCL=1; 
 65     IIC_SDA=1;//发送I2C总线结束信号
 66     delay_us(4);                                   
 67 }
 68 
 69 /*******************************************************************************
 70 1.函数名称:等待应答信号到来
 71 2.包含变量:返回值:1,接收应答失败
 72                         0,接收应答成功
 73 3.修改日期:
 74 *********************************************************************************/
 75 u8 IIC_Wait_Ack(void)
 76 {
 77     u8 ucErrTime=0;
 78     SDA_IN();      //SDA设置为输入  
 79     IIC_SDA=1;delay_us(1);       
 80     IIC_SCL=1;delay_us(1);     
 81     while(READ_SDA)
 82     {
 83         ucErrTime++;
 84         if(ucErrTime>250)
 85         {
 86             IIC_Stop();
 87             return 1;
 88         }
 89     }
 90     IIC_SCL=0;//时钟输出0        
 91     return 0;  
 92 } 
 93 
 94 /*******************************************************************************
 95 1.函数名称:产生ACK应答
 96 2.包含变量:
 97 3.修改日期:
 98 *********************************************************************************/
 99 void IIC_Ack(void)
100 {
101     IIC_SCL=0;
102     SDA_OUT();
103     IIC_SDA=0;
104     delay_us(2);
105     IIC_SCL=1;
106     delay_us(2);
107     IIC_SCL=0;
108 }
109     
110 /*******************************************************************************
111 1.函数名称:不产生ACK应答
112 2.包含变量:
113 3.修改日期:
114 *********************************************************************************/
115 void IIC_NAck(void)
116 {
117     IIC_SCL=0;
118     SDA_OUT();
119     IIC_SDA=1;
120     delay_us(2);
121     IIC_SCL=1;
122     delay_us(2);
123     IIC_SCL=0;
124 }                                          
125 
126 /*******************************************************************************
127 1.函数名称:IIC发送一个字节 返回从机有无应答
128 2.包含变量:1,有应答        0,无应答    
129 3.修改日期:
130 *********************************************************************************/
131 void IIC_Send_Byte(u8 txd)
132 {                        
133     u8 t;   
134     SDA_OUT();         
135     IIC_SCL=0;//拉低时钟开始数据传输
136     for(t=0;t<8;t++)
137     {              
138         IIC_SDA=(txd&0x80)>>7;
139         txd<<=1;       
140         delay_us(2);   //对TEA5767这三个延时都是必须的
141         IIC_SCL=1;
142         delay_us(2); 
143         IIC_SCL=0;    
144         delay_us(2);
145     }     
146 }         
147 
148 /*******************************************************************************
149 1.函数名称:读1个字节,ack=1时,发送ACK,ack=0,发送nACK 
150 2.包含变量:
151 3.修改日期:
152 *********************************************************************************/
153 u8 IIC_Read_Byte(unsigned char ack)
154 {
155     unsigned char i,receive=0;
156     SDA_IN();//SDA设置为输入
157     for(i=0;i<8;i++ )
158     {
159         IIC_SCL=0; 
160         delay_us(2);
161         IIC_SCL=1;
162         receive<<=1;
163         if(READ_SDA)receive++;   
164         delay_us(1); 
165     }                     
166     if (!ack)
167         IIC_NAck();//发送nACK
168     else
169         IIC_Ack(); //发送ACK   
170     return receive;
171 }
 1 #ifndef __MYIIC_H
 2 #define __MYIIC_H
 3 #include "sys.h"
 4   
 5 
 6                      
 7 //IO方向设置
 8 #define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
 9 #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
10 
11 //IO操作函数     
12 #define IIC_SCL    PCout(12) //SCL
13 #define IIC_SDA    PCout(11) //SDA     
14 #define READ_SDA   PCin(11)  //输入SDA 
15 
16 //IIC所有操作函数
17 void IIC_Init(void);                //初始化IIC的IO口                 
18 void IIC_Start(void);                                //发送IIC开始信号
19 void IIC_Stop(void);                              //发送IIC停止信号
20 void IIC_Send_Byte(u8 txd);                    //IIC发送一个字节
21 u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
22 u8 IIC_Wait_Ack(void);                             //IIC等待ACK信号
23 void IIC_Ack(void);                                    //IIC发送ACK信号
24 void IIC_NAck(void);                                //IIC不发送ACK信号
25 
26 void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
27 u8 IIC_Read_One_Byte(u8 daddr,u8 addr);      
28 #endif

 

以上是关于STM32-IIC的主要内容,如果未能解决你的问题,请参考以下文章

STM32-IIC

STM32 IIC协议

STM32IIC通信

半吊子的STM32 — IIC通信

STM32IIC接收到的数据都是0x40怎么办

串口通信之————IIC(软件驱动)