I2C driver
This commit is contained in:
@@ -116,5 +116,5 @@ void Acquisition_time(void) { // Get the netwo
|
|||||||
PCF85063_Time.hour = localTime->tm_hour;
|
PCF85063_Time.hour = localTime->tm_hour;
|
||||||
PCF85063_Time.minute = localTime->tm_min;
|
PCF85063_Time.minute = localTime->tm_min;
|
||||||
PCF85063_Time.second = localTime->tm_sec;
|
PCF85063_Time.second = localTime->tm_sec;
|
||||||
PCF85063_Set_All(PCF85063_Time);
|
//PCF85063_Set_All(PCF85063_Time);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +1,80 @@
|
|||||||
#include "I2C_Driver.h"
|
#include "I2C_Driver.h"
|
||||||
|
|
||||||
|
namespace drivers
|
||||||
void I2C_Init(void) {
|
|
||||||
Wire.begin( I2C_SDA_PIN, I2C_SCL_PIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool I2C_Read(uint8_t Driver_addr, uint8_t Reg_addr, uint8_t *Reg_data, uint32_t Length)
|
|
||||||
{
|
{
|
||||||
Wire.beginTransmission(Driver_addr);
|
|
||||||
Wire.write(Reg_addr);
|
I2C::I2C()
|
||||||
if ( Wire.endTransmission(true)){
|
{
|
||||||
printf("The I2C transmission fails. - I2C Read\r\n");
|
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
|
||||||
return -1;
|
isInitialized = true;
|
||||||
}
|
}
|
||||||
Wire.requestFrom(Driver_addr, Length);
|
|
||||||
for (int i = 0; i < Length; i++) {
|
I2C::~I2C()
|
||||||
*Reg_data++ = Wire.read();
|
{
|
||||||
}
|
Wire.end();
|
||||||
return 0;
|
isInitialized = true;
|
||||||
}
|
}
|
||||||
bool I2C_Write(uint8_t Driver_addr, uint8_t Reg_addr, const uint8_t *Reg_data, uint32_t Length)
|
|
||||||
{
|
const bool I2C::Read(const uint8_t deviceAddr, const uint8_t deviceReg, const uint8_t len, std::vector<uint8_t> &data)
|
||||||
Wire.beginTransmission(Driver_addr);
|
{
|
||||||
Wire.write(Reg_addr);
|
busy.try_lock();
|
||||||
for (int i = 0; i < Length; i++) {
|
Wire.beginTransmission(deviceAddr);
|
||||||
Wire.write(*Reg_data++);
|
Wire.write(deviceReg);
|
||||||
}
|
switch (Wire.endTransmission(true))
|
||||||
if ( Wire.endTransmission(true))
|
{
|
||||||
{
|
case 0:
|
||||||
printf("The I2C transmission fails. - I2C Write\r\n");
|
break; // no error, break switch
|
||||||
return -1;
|
case 1:
|
||||||
}
|
log_e("Data to long to fit in buffer: [%d]", len);
|
||||||
return 0;
|
case 2:
|
||||||
}
|
log_e("Received NAK on address transmit");
|
||||||
|
case 3:
|
||||||
|
log_e("Received NAK on data transmit");
|
||||||
|
case 4:
|
||||||
|
log_e("Unknown Error");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const uint8_t nBytes = Wire.requestFrom(deviceAddr, len);
|
||||||
|
if (nBytes < len)
|
||||||
|
{
|
||||||
|
log_w("Received data is less than expected: len[%d], nBytes[%d]", len, nBytes);
|
||||||
|
}
|
||||||
|
data.clear();
|
||||||
|
data.resize(nBytes); // resize out buffer to received data len, no check if data len is correct
|
||||||
|
for (auto i = 0; i < nBytes; i++)
|
||||||
|
{
|
||||||
|
data[i] = static_cast<uint8_t>(Wire.read());
|
||||||
|
}
|
||||||
|
busy.unlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool I2C::Write(const uint8_t deviceAddr, const uint8_t deviceReg, const std::vector<uint8_t> &data)
|
||||||
|
{
|
||||||
|
busy.lock();
|
||||||
|
Wire.beginTransmission(deviceAddr);
|
||||||
|
Wire.write(deviceReg);
|
||||||
|
for (auto d : data)
|
||||||
|
{
|
||||||
|
Wire.write(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Wire.endTransmission(true))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
break; // no error, break switch
|
||||||
|
case 1:
|
||||||
|
log_e("Data to long to fit in buffer: [%d]", data.size());
|
||||||
|
case 2:
|
||||||
|
log_e("Received NAK on address transmit");
|
||||||
|
case 3:
|
||||||
|
log_e("Received NAK on data transmit");
|
||||||
|
case 4:
|
||||||
|
log_e("Unknown Error");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
busy.unlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace drivers
|
||||||
|
|||||||
@@ -1,10 +1,25 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#define I2C_SCL_PIN 41
|
#define I2C_SCL_PIN 41
|
||||||
#define I2C_SDA_PIN 42
|
#define I2C_SDA_PIN 42
|
||||||
|
|
||||||
void I2C_Init(void);
|
namespace drivers {
|
||||||
|
|
||||||
|
class I2C {
|
||||||
|
private:
|
||||||
|
bool isInitialized = false;
|
||||||
|
std::mutex busy;
|
||||||
|
|
||||||
bool I2C_Read(uint8_t Driver_addr, uint8_t Reg_addr, uint8_t *Reg_data, uint32_t Length);
|
public:
|
||||||
bool I2C_Write(uint8_t Driver_addr, uint8_t Reg_addr, const uint8_t *Reg_data, uint32_t Length);
|
I2C(void);
|
||||||
|
~I2C(void);
|
||||||
|
|
||||||
|
const bool Read(const uint8_t deviceAddr, const uint8_t deviceReg, const uint8_t len, std::vector<uint8_t> &data);
|
||||||
|
const bool Write(const uint8_t deviceAddr, const uint8_t deviceReg, const std::vector<uint8_t> &data);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ void PCF85063_Init(void) // PCF85063 initialized
|
|||||||
uint8_t Value = RTC_CTRL_1_DEFAULT|RTC_CTRL_1_CAP_SEL;
|
uint8_t Value = RTC_CTRL_1_DEFAULT|RTC_CTRL_1_CAP_SEL;
|
||||||
|
|
||||||
I2C_Write(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1);
|
I2C_Write(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1);
|
||||||
I2C_Read(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1);
|
I2C_Read(PCF85063_ADDRESS, RTC_CTRL_1_ADDR, &Value, 1);
|
||||||
if(Value & RTC_CTRL_1_STOP)
|
if(Value & RTC_CTRL_1_STOP)
|
||||||
printf("PCF85063 failed to be initialized.state :%d\r\n",Value);
|
printf("PCF85063 failed to be initialized.state :%d\r\n",Value);
|
||||||
else
|
else
|
||||||
@@ -17,7 +17,7 @@ uint32_t Simulated_time=0; // Analog time counting
|
|||||||
void setup() {
|
void setup() {
|
||||||
Flash_test();
|
Flash_test();
|
||||||
GPIO_Init(); // RGB . Buzzer GPIO
|
GPIO_Init(); // RGB . Buzzer GPIO
|
||||||
I2C_Init();
|
//I2C_Init();
|
||||||
RTC_Init();// RTC
|
RTC_Init();// RTC
|
||||||
SD_Init();
|
SD_Init();
|
||||||
Serial_Init(); // UART(RS485/CAN)
|
Serial_Init(); // UART(RS485/CAN)
|
||||||
|
|||||||
Reference in New Issue
Block a user