IIC
C语言实现
参考原子哥iic代码
时序图
#include "iic.h"
void IIC_Init(void)
{
USER_GPIO->DATA_OUT |= (0x03);
}
void IIC_Start(void)
{
GPIOWritePin(IIC_SDA,GPIO_SET);
GPIOWritePin(IIC_SCL,GPIO_SET);
delay_us(4);
GPIOWritePin(IIC_SDA,GPIO_RESET);
delay_us(4);
GPIOWritePin(IIC_SCL,GPIO_RESET);
}
void IIC_Stop(void)
{
GPIOWritePin(IIC_SCL,GPIO_RESET);
GPIOWritePin(IIC_SDA,GPIO_RESET);
delay_us(6);
GPIOWritePin(IIC_SCL,GPIO_SET);
delay_us(3);
GPIOWritePin(IIC_SDA,GPIO_SET);
delay_us(3);
}
void IIC_Ack(void)
{
uint16_t ucErrTime=0;
delay_us(3);
GPIOWritePin(IIC_SCL,GPIO_SET);
delay_us(6);
while(1)
{
ucErrTime++;
if(ucErrTime>300)
{
//IIC_Stop();
break;
}
}
GPIOWritePin(IIC_SCL,GPIO_RESET);
delay_us(15);
return ;
}
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
GPIOWritePin(IIC_SCL,GPIO_RESET);
for(t=0;t<8;t++)
{
GPIOWritePin(IIC_SDA,(txd&0x80)>>7);
txd<<=1;
delay_us(5);
GPIOWritePin(IIC_SCL,GPIO_SET);
delay_us(5);
GPIOWritePin(IIC_SCL,GPIO_RESET);
//opt_delay(12);
GPIOWritePin(IIC_SDA,GPIO_RESET);
delay_us(5);
}
}
void IICWrite(int reg, int data)
{
IIC_Start();
IIC_Send_Byte(0x58);
IIC_Ack();
IIC_Send_Byte(reg);
IIC_Ack();
IIC_Send_Byte(data);
IIC_Ack();
IIC_Stop();
}
uint8_t IICRead(int reg )
{
int data=0;
IIC_Start();
IIC_Send_Byte(0x58);
IIC_Ack();
IIC_Send_Byte(reg);
IIC_Ack();
delay_us(5);
IIC_Start();
IIC_Send_Byte(0x59);
IIC_Ack();
Data = IIC_Read_Byte();
IIC_Ack();
IIC_Stop();
return Data;
}
uint8_t IIC_Read_Byte()
{
unsigned char i,receive=0;
READ_SDA;
for(i=0;i<8;i++ )
{
GPIOWritePin(IIC_SCL,GPIO_RESET);
delay_us(5);
GPIOWritePin(IIC_SCL,GPIO_SET);
receive<<=1;
if(READ_SDA)receive++;
delay_us(5);
}
IIC_Ack();
return receive;
}
#ifndef __IIC_H
#define __IIC_H
#include "main.h"
#define IIC_SCL 0
#define IIC_SDA 1
#define READ_SDA GPIOReadPin(1)
void IIC_Init(void); //³õʼ»¯IICµÄIO¿Ú
void IIC_Start(void); //·¢ËÍIIC¿ªÊ¼ÐźÅ
void IIC_Stop(void); //·¢ËÍIICÍ£Ö¹ÐźÅ
void IIC_Send_Byte(uint8_t txd); //IIC·¢ËÍÒ»¸ö×Ö½Ú
void IIC_Ack(void); //IIC·¢ËÍACKÐźÅ
void IICWrite(int reg, int data);
uint8_t IICRead(int reg );
uint8_t IIC_Read_Byte();
#endif