写波形
读波形
IIC_IO.c
#include "iic_io.h"typedef union
{u8 R_DATA8[4];u16 R_DATA16[2];u32 R_DATA32;
}UN_32BIT;void IIC_Delay()//250KHz
{u8 i=30;while(i)i--;
}void IIC1_Start(void)
{IIC1_SDA_I();IIC_Delay();IIC1_SCK_H();IIC_Delay();IIC1_SDA_L();IIC1_SDA_O();IIC_Delay();IIC1_SCK_L();
}
void IIC1_Stop(void)
{IIC1_SDA_O();IIC1_SDA_L();IIC_Delay();IIC1_SCK_H(); IIC_Delay();IIC1_SDA_I();
}u8 IIC1_Wait_Ack(void)
{u8 ucErrTime=0;IIC1_SDA_I();IIC_Delay();IIC1_SCK_H();while(IIC1_SDA_D()){ucErrTime++;if(ucErrTime>100)return 1;}IIC1_SCK_L();return 0;
} void IIC1_Ack(u8 AK)
{IIC1_SDA_O();if(AK)IIC1_SDA_H();elseIIC1_SDA_L();IIC_Delay();IIC1_SCK_H();IIC_Delay();IIC1_SCK_L();
}u8 IIC1_Send_Byte(u8 data)
{ u8 i=8,temp=0;u8 ack=0;while(i--){IIC1_SCK_L();IIC_Delay();temp=data&0x80;if(temp)IIC1_SDA_I();else{IIC1_SDA_L();IIC1_SDA_O();}IIC_Delay();data <<= 1;IIC1_SCK_H();IIC_Delay();}IIC1_SCK_L();IIC_Delay();ack=IIC1_Wait_Ack();return ack;
}u8 IIC1_Read_Byte(u8 ack)
{u8 i=8,data=0;IIC1_SCK_L();IIC_Delay();IIC1_SDA_I();IIC_Delay();IIC1_SDA_I();IIC_Delay();IIC_Delay();data=0;while(i--){data <<= 1;IIC1_SCK_H();IIC_Delay();if(IIC1_SDA_D())data = data | 0x01;elsedata = data & 0xFE;IIC1_SCK_L();IIC_Delay();}IIC1_Ack(ack);return data;
}u8 IIC1_TXBUFF[10]={0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};
u8 IIC1_RXBUFF[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};u8 IIC1_WriteLen(u8 Device_Address,u32 Register_Address,u8 RA_Len,u8 *Txbuff,u8 TxLen)
{ u8 i;u8 ACK=0;UN_32BIT Addr;Addr.R_DATA32=Register_Address;IIC1_Start();ACK|=IIC1_Send_Byte(Device_Address);switch(RA_Len){case 0x04:ACK|=IIC1_Send_Byte(Addr.R_DATA8[3]);case 0x03:ACK|=IIC1_Send_Byte(Addr.R_DATA8[2]);case 0x02:ACK|=IIC1_Send_Byte(Addr.R_DATA8[1]);case 0x01:ACK|=IIC1_Send_Byte(Addr.R_DATA8[0]);break;default: ACK|=IIC1_Send_Byte(Addr.R_DATA8[0]);break;}for(i=0;i<TxLen;i++){ACK|=IIC1_Send_Byte(Txbuff[i]);if(ACK)break;}IIC1_Stop();return ACK;
}u8 IIC1_ReadLen(u8 Device_Address,u32 Register_Address,u8 RA_Len,u8 *Rxbuff,u8 RxLen)
{ u8 i;u8 ACK=0;UN_32BIT Addr;Addr.R_DATA32=Register_Address;IIC1_Start();ACK|=IIC1_Send_Byte(Device_Address);switch(RA_Len){case 0x04:ACK|=IIC1_Send_Byte(Addr.R_DATA8[3]);case 0x03:ACK|=IIC1_Send_Byte(Addr.R_DATA8[2]);case 0x02:ACK|=IIC1_Send_Byte(Addr.R_DATA8[1]);case 0x01:ACK|=IIC1_Send_Byte(Addr.R_DATA8[0]);break;default: ACK|=IIC1_Send_Byte(Addr.R_DATA8[0]);break;}IIC1_Start();ACK|=IIC1_Send_Byte(Device_Address|0x01);if(!ACK){for(i=0;i<RxLen-1;i++){Rxbuff[i]=IIC1_Read_Byte(0);}Rxbuff[i]=IIC1_Read_Byte(1);}IIC1_Stop();return ACK;
}
IIC_IO.h
#ifndef IIC_IO_H
#define IIC_IO_H#include "user_define.h"
//#include <stdbool.h>
#include "gpio.h"#define IIC1_SCK_GPIO_PORT GPIOA
#define IIC1_SDA_GPIO_PORT GPIOA
#define IIC1_SCK_PIN GPIO_PIN_3
#define IIC1_SDA_PIN GPIO_PIN_2#define IIC1_SDA_H() IIC1_SDA_GPIO_PORT->PBSC = IIC1_SDA_PIN
#define IIC1_SDA_L() IIC1_SDA_GPIO_PORT->PBC = IIC1_SDA_PIN
#define IIC1_SDA_I() IIC1_SDA_GPIO_PORT->PMODE = IIC1_SDA_GPIO_PORT->PMODE & 0xFFFFFFCF
#define IIC1_SDA_O() IIC1_SDA_GPIO_PORT->PMODE = (IIC1_SDA_GPIO_PORT->PMODE & 0xFFFFFFCF)|0x00000010
#define IIC1_SDA_D() GPIO_Input_Pin_Data_Get(IIC1_SDA_GPIO_PORT,IIC1_SDA_PIN)#define IIC1_SCK_H() IIC1_SCK_GPIO_PORT->PBSC = IIC1_SCK_PIN
#define IIC1_SCK_L() IIC1_SCK_GPIO_PORT->PBC = IIC1_SCK_PINextern u8 IIC1_WriteLen(u8 Device_Address,u32 Register_Address,u8 RA_Len,u8 *Txbuff,u8 TxLen);
extern u8 IIC1_ReadLen(u8 Device_Address,u32 Register_Address,u8 RA_Len,u8 *Rxbuff,u8 TxLen);
extern u8 IIC1_TXBUFF[10];
extern u8 IIC1_RXBUFF[10];#endif