#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;
}
STM32开发笔记 | RX8111CE实时时钟模拟IIC通信
最新推荐文章于 2024-08-26 17:03:45 发布