新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2017-5-14
- 在线时间
- 8 小时
|
//初始化IIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOX, ENABLE ); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = SCL_Pin|SDA_Pin; //SCL
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_Init(GPIOX, &GPIO_InitStructure);
GPIO_SetBits(GPIOX,SCL_Pin|SDA_Pin); //PB6,PB7 输出高
}
#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"
#include "delay.h"
//端口配置
#define GPIOX GPIOB
#define RCC_APB2Periph_GPIOX RCC_APB2Periph_GPIOB
#define SCL_Pin GPIO_Pin_6
#define SDA_Pin GPIO_Pin_7
#define IIC_SCL_H GPIOX->BSRR = SCL_Pin //SCL高电平
#define IIC_SCL_L GPIOX->BRR = SCL_Pin //SCL低电平
#define IIC_SDA_H GPIOX->BSRR = SDA_Pin //SDA高电平
#define IIC_SDA_L GPIOX->BRR = SDA_Pin //SDA低电平
#define READ_SDA GPIOX->IDR & SDA_Pin //SDA读数据
//IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
#endif
以上为修改原子的F1模拟IIC对EEPROM进行操作,PB6,PB7配置成开路输出,就不用频繁改变端口的方向
贴出来的为修改的部分,其他部分不变。
出现的问题:只能读出不能写入数据。
经过实验把#define IIC_SDA_H GPIOX->BSRR = SDA_Pin 写改为#define IIC_SDA_H GPIO_SetBits(GPIOX,SDA_Pin)就可以对AT24C02进行读写了
可为什莫?????GPIOX->BSRR = SDA_Pin和GPIO_SetBits(GPIOX,SDA_Pin)不都是把SDA线置高吗,有什莫区别???
|
|