Files
motor_controller2/my_software/iic.c
T

106 lines
1.6 KiB
C

/*
* iic.c
*
* Created on: Oct 24, 2021
* Author: wuwenfeng
*/
#include "iic.h"
#include "gpio.h"
#define iic_sda(x) HAL_GPIO_WritePin(iic_sda_GPIO_Port, iic_sda_Pin, x)
#define iic_scl(x) HAL_GPIO_WritePin(iic_scl_GPIO_Port, iic_scl_Pin, x)
#define read_iic_sda HAL_GPIO_ReadPin(iic_sda_GPIO_Port, iic_sda_Pin)
void iic_start()
{
iic_sda(1);
iic_scl(1);
iic_sda(0);
iic_scl(0);
}
void iic_stop()
{
iic_sda(0);
iic_scl(1);
iic_sda(1);
}
void iic_ack()
{
iic_scl(1);
iic_scl(0);
}
void IIC_Write_Byte(unsigned char IIC_Byte){
iic_scl(0);
change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,0);
for(unsigned char i=0;i<8;i++)
{
if(IIC_Byte & 0x80)
{
iic_sda(1);
}else{
iic_sda(0);
}
IIC_Byte<<=1;
iic_scl(1);
iic_scl(0);
}
}
unsigned char IIC_Read_Byte()
{
unsigned char k=0;
iic_scl(0);
change_io_function(iic_sda_GPIO_Port, iic_sda_Pin,1);
for(unsigned char i=0; i<8; i++)
{
iic_scl(1);
if(read_iic_sda==1)
{
k|=0x01;
}
k<<=1;
iic_scl(0);
}
return(k);
}
void IIC_SAND_DATE(unsigned char DEVICE_ADD,unsigned char IN_DEVICE_ADD,char *DATAS,uint16_t LONG)
{
iic_start();
IIC_Write_Byte(DEVICE_ADD);
iic_ack();
IIC_Write_Byte(IN_DEVICE_ADD);
iic_ack();
for(int a=0;a<LONG;a++)
{
IIC_Write_Byte(*DATAS);
DATAS++;
}
iic_ack();
iic_stop();
}
void IIC_READ_DATE(unsigned char DEVICE_ADD,unsigned char IN_DEVICE_ADD,char *DATAS,uint16_t LONG)
{
iic_start();
IIC_Write_Byte(DEVICE_ADD);
iic_ack();
IIC_Write_Byte(IN_DEVICE_ADD);
iic_ack();
iic_start();
IIC_Write_Byte(IN_DEVICE_ADD+1);
iic_ack();
for(int a=0;a<LONG;a++)
{
*DATAS=IIC_Read_Byte();
DATAS++;
}
iic_ack();
iic_stop();
}