STM32开发笔记 | RX8111CE实时时钟模拟IIC通信

#include "stm32f10x.h"

#define RX8111CE_IIC_WR			0x64
#define RX8111CE_IIC_RD			0X65

#define IIC_SCL_HIGH		GPIO_SetBits(GPIOB, GPIO_Pin_5);
#define IIC_SCL_LOW			GPIO_ResetBits(GPIOB, GPIO_Pin_5);
#define IIC_SDA_HIGH		GPIO_SetBits(GPIOB, GPIO_Pin_6);
#define IIC_SDA_LOW			GPIO_ResetBits(GPIOB, GPIO_Pin_6);
#define READ_IIC_SDA		GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)

//引脚配置
void IIC_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	IIC_Stop();
}

//起始条件
void IIC_Start(void)
{
	IIC_SDA_HIGH
	IIC_SCL_HIGH
	delay_us(10);
	IIC_SDA_LOW
	delay_us(10);
	IIC_SCL_LOW
}

//停止条件
void IIC_Stop(void)
{
	IIC_SDA_LOW
	IIC_SCL_HIGH
	delay_us(10);
	IIC_SDA_HIGH
}

//等待ACK
uint8_t IIC_Wait_ACK(void)
{
	uint8_t ret;
	IIC_SDA_HIGH
	delay_us(10);
	IIC_SCL_HIGH
	delay_us(10);
	if(READ_IIC_SDA) ret = 1; else ret = 0;
	IIC_SCL_LOW
	delay_us(10);
	return ret;  
}

//发送ACK
void IIC_ACK(void)
{
	IIC_SDA_LOW
	delay_us(10);
	IIC_SCL_HIGH
	delay_us(10);
	IIC_SCL_LOW
	delay_us(10);
	IIC_SDA_HIGH
}

//发送停止ACK响应
void IIC_NotACK(void)
{
	IIC_SDA_HIGH
	delay_us(10);
	IIC_SCL_HIGH
	delay_us(10);
	IIC_SCL_LOW
	delay_us(10);
}

//发送数据
void IIC_SendByte(uint8_t data)
{
	uint8_t count;
	IIC_SCL_LOW
    for(count = 0; count < 8; count++)
    {
		if((data & 0x80) > 0) IIC_SDA_HIGH else IIC_SDA_LOW
      	data <<= 1; 	  
		delay_us(10);   
		IIC_SCL_HIGH
		delay_us(10); 
		IIC_SCL_LOW
		delay_us(10);
    }
}

//读取数据
uint8_t IIC_ReadByte(void)
{
	uint8_t recvData = 0, count;
    for(count = 0; count < 8; count++ )
	{
		recvData <<= 1;
		IIC_SCL_HIGH
		delay_us(10);
        if(READ_IIC_SDA) recvData++;
		IIC_SCL_LOW
		delay_us(10);
    }
    return recvData;
}

//读取一个字节
uint8_t iic_read_the_registerByte(uint16_t reg_addr)
{
	uint8_t data;
	
	IIC_Start();
	IIC_SendByte(RX8111CE_IIC_WR);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	IIC_SendByte(reg_addr);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	
	IIC_Start();
	IIC_SendByte(RX8111CE_IIC_RD);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	
	data = IIC_ReadByte();
	IIC_NotACK();

	IIC_Stop();
	return data;
	
cmd_fail:
	IIC_Stop();
	return 0;
}

//从指定寄存器开始读取多个数据
uint8_t Read_IIC_Buffer(uint8_t *buffer, uint8_t reg_addr, uint16_t bufferSize)
{
	uint16_t i;
	
	IIC_Start();
	IIC_SendByte(RX8111CE_IIC_WR);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	IIC_SendByte(reg_addr);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	
	IIC_Start();
	IIC_SendByte(RX8111CE_IIC_RD);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	
	for(i = 0; i < bufferSize; i++)
	{
		buffer[i] = IIC_ReadByte();
		if(i != bufferSize - 1) IIC_ACK(); else IIC_NotACK();
	}
	IIC_Stop();
	return 1;
	
cmd_fail:
	IIC_Stop();
	return 0;
}

//写一个字节到指定寄存器
uint8_t IIC_WriteByte(uint8_t reg_addr, uint8_t data)
{	
	IIC_Start();
	IIC_SendByte(RX8111CE_IIC_WR);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	IIC_SendByte(reg_addr);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	
	IIC_SendByte(data);
	if(IIC_Wait_ACK() != 0)	goto cmd_fail;
	
	IIC_Stop();
	return 1;
	
cmd_fail:
	IIC_Stop();
	return 0;
}

//从指定寄存器开始写多个数据
uint8_t Write_IIC_Buffer(uint8_t *buffer, uint8_t reg_addr, uint16_t bufferSize)
{
	uint16_t i;
	
	IIC_Start();
	IIC_SendByte(RX8111CE_IIC_WR);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	IIC_SendByte(reg_addr);
	if(IIC_Wait_ACK() != 0) goto cmd_fail;
	
	for(i = 0; i < bufferSize; i++)
	{
		IIC_SendByte(buffer[i]);
		if(IIC_Wait_ACK() != 0) goto cmd_fail;
	}
	IIC_Stop();
	return 1;
	
cmd_fail:
	IIC_Stop();
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值