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的主要内容,如果未能解决你的问题,请参考以下文章