Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 8:530aad60c490, committed 2016-07-26
- Comitter:
- seajayshore
- Date:
- Tue Jul 26 16:26:35 2016 +0000
- Parent:
- 7:c9a0ce000a18
- Commit message:
- Refactoring & re-organisation with true C++ constructors.
Changed in this revision
| HY3116.cpp | Show annotated file Show diff for this revision Revisions of this file |
| HY3116.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r c9a0ce000a18 -r 530aad60c490 HY3116.cpp
--- a/HY3116.cpp Mon Jul 25 21:23:56 2016 +0000
+++ b/HY3116.cpp Tue Jul 26 16:26:35 2016 +0000
@@ -1,78 +1,107 @@
#include "HY3116.h"
-I2C i2c(p22, p21);
-DigitalIn adcIrq(ADC_IRQ);
-//I2C i2c(p6, p5);
+/**
+ * Default Constructor.
+ * Sets default I2C pins with default frequency
+ */
+HY3116::HY3116() :
+ i2c(p22, p21)
+{
+
+ // Set the I2C clock frequency
+ i2c.frequency(250000);
+} // End constructor
-///**
-// * Constructor.
-// * Prepares the output pins.
-// */
-//HY3116::HY3116(PinName sda,
-// PinName scl) : i2c(sda, scl)
-//{
-//
-// // Set the I2C clock frequency
-// i2c.frequency(100000);
-//} // End constructor
+/**
+ * Constructor #2
+ * Sets I2C pins with default frequency
+ */
+HY3116::HY3116(PinName sda,
+ PinName scl) :
+ i2c(sda, scl)
+{
+
+ // Set the I2C clock frequency
+ i2c.frequency(250000);
+} // End constructor
+
+/**
+ * Constructor #3
+ * Sets I2C pins and non-default frequency
+ */
+HY3116::HY3116(PinName sda,
+ PinName scl,
+ int freq ) :
+ i2c(sda, scl)
+{
+
+ // Set the I2C clock frequency
+ i2c.frequency(freq);
+} // End constructor
-///**
-// * Destructor.
-// */
-//HY3116::~HY3116()
-//{
-//
-//}
+/**
+ * Destructor.
+ */
+HY3116::~HY3116()
+{
+
+}
+
+/**
+ * Helper function to write correct data to HY3116 registers
+ */
+int HY3116::writeRegister(uint8_t regAddress, uint8_t writeData)
+{
+ int retval = 1;
+ char writeBuffer[2];
+ writeBuffer[0]=regAddress;
+ writeBuffer[1]=writeData;
+ retval = i2c.write(HY3116_ADDRESS,writeBuffer,sizeof(writeBuffer),0);
+ if (retval != 0) {
+ return retval;
+ }
+ return 0;
+}
-// Single-byte write helper function
-int HY3116::writeByte(uint8_t address, uint8_t subAddress, uint8_t data)
+/**
+ * Helper function to write correct data to HY3116 registers
+ */
+int HY3116::readRegister(uint8_t regAddress, uint8_t byteNum, uint8_t* dest)
{
- int write_error = 0;
- char data_write[2];
- data_write[0]=subAddress; // I2C sends MSB first. Namely >>|subAddress|>>|data|
- data_write[1]=data;
- write_error = i2c.write(address,data_write,2,0); // i2c.write(int address, char* data, int length, bool repeated=false);
- if (write_error != 0) {
- return 1;
+ int retval = 1;
+ if (byteNum > sizeof(dest)) {
+ return retval;
}
- return 0;
+ char writeBuffer[1];
+ writeBuffer[0] = regAddress;
+ char readBuffer[byteNum];
+ retval = i2c.write(HY3116_ADDRESS,writeBuffer,sizeof(writeBuffer),1);
+ if (retval != 0) {
+ return retval;
+ }
+ retval = i2c.read(HY3116_ADDRESS,readBuffer,sizeof(readBuffer),0);
+ if (retval != 0) {
+ return retval;
+ }
+ for(int i=0; i<byteNum; i++) {
+ dest[i]=readBuffer[i];
+ }
+ return 0;
}
// Function to send the reset command
int HY3116::resetChip()
{
- int write_error = 0;
- char data_write[1];
- data_write[0]=RESET;
- write_error = i2c.write(HY3116_ADDRESS,data_write,1,0); // i2c.write(int address, char* data, int length, bool repeated=false);
- if (write_error != 0) {
+ int retval = 0;
+ char writeBuffer[1];
+ writeBuffer[0] = RESET;
+ retval = i2c.write(RESET_ADDRESS,writeBuffer,sizeof(writeBuffer),0);
+ if (retval != 0) {
return 1;
}
return 0;
}
-// Multi-byte read helper function
-int HY3116::readBytes(uint8_t address, uint8_t subAddress, uint8_t byteNum, uint8_t* dest, bool alreadyRead)
-{
- int write_error = 0;
- int read_error = 0;
- char data[14],data_write[1];
- data_write[0]=subAddress;
- if (!alreadyRead) {
- write_error = i2c.write(address,data_write,1,1);
- }
- if (write_error != 0) {
- return 1;
- }
- read_error = i2c.read(address,data,byteNum,0);
- if (read_error != 0) {
- return 1;
- }
- for(int i=0;i<byteNum;i++) // equate the addresses
- dest[i]=data[i];
- return 0;
-}
-
// Dedicated ADC-output read, check & format function
uint8_t HY3116::readAdc(int32_t *_adcReading)
{
@@ -83,11 +112,8 @@
uint8_t adc_error = 0;
uint8_t returnError = 0;
- // Change this to improve I2C speed slightly (see datasheet)
- bool alreadyRead = 0;
-
// Read in the raw ADO bytes
- adc_error = readBytes(HY3116_ADDRESS, ADO, 3, &rawData[0], alreadyRead);
+ adc_error = readRegister(ADO, 3, &rawData[0]);
if (adc_error != 0) {
returnError = 2;
return returnError;
@@ -126,32 +152,36 @@
{
int adc_error = 0;
- // Set the I2C clock frequency
- i2c.frequency(100000);
+ // Reset the chip
+ adc_error = resetChip();
+ if (adc_error != 0) {
+ return 0;
+ }
+ wait_ms(1);
// Set-up the SYS register
- adc_error = writeByte(HY3116_ADDRESS, SYS, 0b00011100); // Enable the ADC & LDO
+ adc_error = writeRegister(SYS, 0b00011100); // Enable the ADC & LDO
if (adc_error != 0) {
return 0;
}
wait_ms(1); // wait 100 ms to stabilize
// Set-up the ADC1 register
- adc_error = writeByte(HY3116_ADDRESS, ADC1, 0b00001000); // Set inputs to AIN1 & AIN2
+ adc_error = writeRegister(ADC1, 0b00001000); // Set inputs to AIN1 & AIN2
if (adc_error != 0) {
return 0;
}
wait_ms(1); // wait 100 ms to stabilize
// Set-up the ADC2 register
- adc_error = writeByte(HY3116_ADDRESS, ADC2, 0b01010000); // Set pos. ref. voltage to VDDA, neg. ref. to VSSA, DC offset to 0VRef
+ adc_error = writeRegister(ADC2, 0b01010000); // Set pos. ref. voltage to VDDA, neg. ref. to VSSA, DC offset to 0VRef
if (adc_error != 0) {
return 0;
}
wait_ms(1); // wait 100 ms to stabilize
// Set-up the ADC3 register
- adc_error = writeByte(HY3116_ADDRESS, ADC3, 0b00111111); // Set to int. osc. 327kHz, full ref. range, PGA to 32x, pre-amp to 2x
+ adc_error = writeRegister(ADC3, 0b00111111); // Set to int. osc. 327kHz, full ref. range, PGA to 32x, pre-amp to 2x
if (adc_error != 0) {
return 0;
}
@@ -163,17 +193,11 @@
// [3] = HS conversion rate, 0 = slow (327kHz)
// [4:6] = OSR ADC output rate, 110 = 40SPS (when HS = 0)
// [7] = N/A
- adc_error = writeByte(HY3116_ADDRESS, ADC4, 0b01001100);
+ adc_error = writeRegister(ADC4, 0b01001100);
if (adc_error != 0) {
return 0;
}
wait_ms(1); // Wait to stabilise
- adc_error = resetChip();
- if (adc_error != 0) {
- return 0;
- }
- wait_ms(1);
-
return 1;
}
\ No newline at end of file
diff -r c9a0ce000a18 -r 530aad60c490 HY3116.h
--- a/HY3116.h Mon Jul 25 21:23:56 2016 +0000
+++ b/HY3116.h Tue Jul 26 16:26:35 2016 +0000
@@ -1,29 +1,40 @@
#include "main.h"
#include "mbed.h"
+/**
+ * Define I2C addresses for the device
+ */
#define HY3116_ADDRESS 0xA0
+#define RESET_ADDRESS 0x00
-#define SYS 0x00
-#define ADC1 0x01
-#define ADC2 0x02
-#define ADC3 0x03
-#define ADC4 0x04
-#define ADO 0x05
-#define RESET 0x06
+/**
+ * Define settings & I2C command registers
+ */
+#define SYS 0x00
+#define ADC1 0x01
+#define ADC2 0x02
+#define ADC3 0x03
+#define ADC4 0x04
+#define ADO 0x05
+#define RESET 0x06
-/* Function Prototypes */
+/**
+ * HY3116 class definition
+ */
class HY3116
{
public:
-// HY3116(PinName sda, PinName scl);
-// ~HY3116();
- int writeByte(uint8_t address, uint8_t subAddress, uint8_t data);
- int resetChip();
- int readBytes(uint8_t address, uint8_t subAddress, uint8_t byteNum, uint8_t* dest, bool alreadyRead);
+ HY3116();
+ HY3116(PinName sda, PinName scl);
+ HY3116(PinName sda, PinName scl, int freq);
+ ~HY3116();
uint8_t readAdc(int32_t *_adcReading);
bool init();
private:
-// I2C i2c;
+ I2C i2c;
+ int writeRegister(uint8_t regAddress, uint8_t data);
+ int readRegister(uint8_t regAddress, uint8_t byteNum, uint8_t* dest);
+ int resetChip();
};