ams-slave-22/Core/Src/SoftI2C.c

130 lines
2.2 KiB
C

#include "SoftI2C.h"
#include "stm32f4xx_hal.h"
void Soft_I2C_Init() {}
void Soft_I2C_Transmit(uint8_t address, uint8_t* databuffer,
uint8_t bufferlength) {
uint8_t nack = 0;
setSDCLK(); // Generate Start Condition
bitwait();
setSDA(0);
bitwait();
for (int i = 0; i < 8; i++) // Write I2C-Slave Address
{
setSDA((address >> (7 - i) & 0x01));
bitwait();
resetSDCLK();
bitwait();
setSDCLK();
bitwait();
}
SDA_ReadMode();
resetSDCLK();
bitwait();
nack += readSDA();
bitwait();
SDA_WriteMode();
setSDA(0);
setSDCLK();
bitwait();
for (int n = 0; n < bufferlength; n++) // Write Data
{
for (int i = 0; i < 8; i++) {
setSDA((databuffer[n] >> (7 - i) & 0x01));
bitwait();
resetSDCLK();
bitwait();
setSDCLK();
bitwait();
}
SDA_ReadMode();
resetSDCLK();
bitwait();
nack += readSDA();
bitwait();
SDA_WriteMode();
setSDA(0);
setSDCLK();
bitwait();
}
resetSDCLK(); // Generate Stop Condition
bitwait();
setSDA(1);
bitwait();
}
void Soft_I2C_Receive(uint8_t address, uint8_t* databuffer,
uint8_t bufferlength) {
uint8_t nack = 0;
setSDCLK(); // Generate Start Condition
bitwait();
setSDA(0);
bitwait();
for (int i = 0; i < 8; i++) // Write I2C-Slave Address
{
setSDA((address >> (7 - i) & 0x01));
bitwait();
resetSDCLK();
bitwait();
setSDCLK();
bitwait();
}
SDA_ReadMode();
resetSDCLK();
bitwait();
nack += readSDA();
bitwait();
for (int n = 0; n < bufferlength; n++) {
databuffer[n] = 0;
for (int i = 0; i < 8; i++) {
setSDCLK();
bitwait();
resetSDCLK();
bitwait();
databuffer[n] |= readSDA() << (7 - i);
bitwait();
}
setSDCLK();
bitwait();
SDA_WriteMode();
setSDA(0);
bitwait();
resetSDCLK();
bitwait();
SDA_ReadMode();
}
resetSDCLK(); // Generate Stop Condition
bitwait();
setSDA(1);
bitwait();
}
void SDA_WriteMode() {}
void SDA_ReadMode() {}
void setSDA(uint8_t state) {}
uint8_t readSDA() {}
void bitwait() {}
void setSDCLK() {}
void resetSDCLK() {}