新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2022-3-11
- 在线时间
- 3 小时
|
1金钱
其中iic.c文件这样的
#ifndef _MYIIC_H
#define _MYIIC_H
#include "sys.h"
#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<(9*2);} //PC1êäèëÄ£ê½
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<(9*2);} //PC1êä3öÄ£ê½
#define IIC_SCL(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET))//SCL
#define IIC_SDA(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET))//SDA
#define READ_SDA HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)//êäèëSDA
void IIC_Init(void); //3õê¼»ˉIICμÄIO¿ú
void IIC_Start(void); //·¢ËíIIC¿aê¼DÅoÅ
void IIC_Stop(void); //·¢ËíIICí£Ö1DÅoÅ
void IIC_Send_Byte(u8 txd); //IIC·¢Ëíò»¸ö×Ö½ú
u8 IIC_Read_Byte(unsigned char ack);//IIC¶áè¡ò»¸ö×Ö½ú
u8 IIC_Wait_Ack(void); //IICμè′yACKDÅoÅ
void IIC_Ack(void); //IIC·¢ËíACKDÅoÅ
void IIC_NAck(void); //IIC2»·¢ËíACKDÅoÅ
void IIC_Write_One_Byte(u8 daddr, u8 addr, u8 data);
u8 IIC_Read_One_Byte(u8 daddr, u8 addr);
#endif
iic.h文件这样子
#include "myiic.h"
#include "delay.h"
/**
* @brief IIC3õê¼»ˉoˉêy
*
* @param void
*
* @return void
*/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //ê1ÄüGPIOCê±Öó
GPIO_Initure.Pin = GPIO_PIN_8 | GPIO_PIN_9;
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //íÆíìêä3ö
GPIO_Initure.Pull = GPIO_PULLUP; //éÏà-
GPIO_Initure.Speed = GPIO_SPEED_FAST; //¿ìËù
HAL_GPIO_Init(GPIOB, &GPIO_Initure);
IIC_SDA(1);
IIC_SCL(1);
}
/**
* @brief 2úéúIICÆeê¼DÅoÅ
*
* @param void
*
* @return void
*/
void IIC_Start(void)
{
SDA_OUT(); //sdaÏßêä3ö
IIC_SDA(1);
IIC_SCL(1);
delay_us(4);
IIC_SDA(0);//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL(0);//ÇˉסI2C×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
}
/**
* @brief 2úéúIICí£Ö1DÅoÅ
*
* @param void
*
* @return void
*/
void IIC_Stop(void)
{
SDA_OUT();//sdaÏßêä3ö
IIC_SDA(0);
IIC_SCL(1);
delay_us(4);
IIC_SDA(1);//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL(0);//·¢ËíI2C×üÏß½áêøDÅoÅ
}
/**
* @brief μè′yó|′eDÅoÅμ½à′
*
* @param void
*
* @return u8 1£¬½óêÕó|′eê§°ü
* 0£¬½óêÕó|′e3é1|
*/
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime = 0;
SDA_IN(); //SDAéèÖÃÎaêäèë
IIC_SDA(1);
delay_us(2);
IIC_SCL(1);
delay_us(2);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime > 250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL(0);//ê±Öóêä3ö0
return 0;
}
/**
* @brief 2úéúACKó|′e
*
* @param void
*
* @return void
*/
void IIC_Ack(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(0);
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
}
/**
* @brief 2»2úéúACKó|′e
*
* @param void
*
* @return void
*/
void IIC_NAck(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(1);
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
}
/**
* @brief IIC·¢Ëíò»¸ö×Ö½ú
*
* @param txd Dèòa·¢ËíμÄêy¾Y
*
* @return void
*/
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL(0);//à-μíê±Öó¿aê¼êy¾Y′«êä
for(t = 0; t < 8; t++)
{
IIC_SDA((txd & 0x80) >> 7);
txd <<= 1;
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
delay_us(2);
}
}
/**
* @brief ¶á1¸ö×Ö½úêy¾Y
*
* @param ack 1£¬·¢ËíACK 0£¬·¢ËínACK
*
* @return u8 ·μ»Ø¶áè¡êy¾Y
*/
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i, receive = 0;
SDA_IN();//SDAéèÖÃÎaêäèë
for(i = 0; i < 8; i++)
{
IIC_SCL(0);
delay_us(2);
IIC_SCL(1);
receive <<= 1;
if(READ_SDA)receive++;
delay_us(2);
}
if(!ack)
IIC_NAck();//·¢ËínACK
else
IIC_Ack(); //·¢ËíACK
return receive;
}
最后我示波器的波形是这样的
file:///C:\Users\13998\Documents\Tencent Files\1399834302\Image\C2C\9EE55A48F534502512B563E46223B0AD.jpgfile:///C:\Users\13998\Documents\Tencent Files\1399834302\Image\C2C\3D0822640D5A556D428600A818D9F18A.jpgfile:///C:\Users\13998\Documents\Tencent Files\1399834302\Image\C2C\F4410C3CF190CE2603DF160715FD5ECE.jpg
然后对于快速模式400Khz,延时多少us合适呢?
麻烦大佬帮忙解答一下。
|
|