|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /**
- @copyright (C) 2017 Melexis N.V.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- */
-
- #include <Arduino.h>
- #include <Wire.h>
- #include "MLX90640_I2C_Driver.h"
-
- void MLX90640_I2CInit()
- {
-
- }
- int MLX90640_I2CRead(uint8_t _deviceAddress, unsigned int startAddress, unsigned int nWordsRead, uint16_t *data)
- {
- // nWordsRead must be <= 32767
- Wire.beginTransmission(_deviceAddress);
- Wire.write(startAddress >> 8); //MSB
- Wire.write(startAddress & 0xFF); //LSB
- Wire.endTransmission(false);
- i2c_err_t error = Wire.readTransmission(_deviceAddress, (uint8_t*) data, nWordsRead*2);
- if(error != 0){//problems
- Serial.printf("Block read from sensor(0x%02X) at address=%d of %d uint16_t's failed=%d(%s)\n",
- _deviceAddress,startAddress,nWordsRead,error,Wire.getErrorText(error));
- }
- else { // reverse byte order, sensor Big Endian, ESP32 Little Endian
- for(auto a = 0; a<nWordsRead; a++){
- data[a] = ((data[a] & 0xff)<<8) | (( data[a]>>8)&0xff);
- }
- }
- return 0;
- }
- /*
- //Read a number of words from startAddress. Store into Data array.
- //Returns 0 if successful, -1 if error
- int MLX90640_I2CRead(uint8_t _deviceAddress, unsigned int startAddress, unsigned int nWordsRead, uint16_t *data)
- {
-
- //Caller passes number of 'unsigned ints to read', increase this to 'bytes to read'
- uint16_t bytesRemaining = nWordsRead * 2;
-
- //It doesn't look like sequential read works. Do we need to re-issue the address command each time?
-
- uint16_t dataSpot = 0; //Start at beginning of array
-
- //Setup a series of chunked I2C_BUFFER_LENGTH byte reads
- while (bytesRemaining > 0)
- {
- Wire.beginTransmission(_deviceAddress);
- Wire.write(startAddress >> 8); //MSB
- Wire.write(startAddress & 0xFF); //LSB
- if(Wire.endTransmission(false) != 7){
- Serial.println("Error: Sensor did not ack");
- return (0);//Sensor did not ACK
-
- }
- uint16_t numberOfBytesToRead = bytesRemaining;
- if (numberOfBytesToRead > I2C_BUFFER_LENGTH) numberOfBytesToRead = I2C_BUFFER_LENGTH;
-
- Wire.requestFrom((uint8_t)_deviceAddress, numberOfBytesToRead);
- if (Wire.available())
- {
- for (uint16_t x = 0 ; x < numberOfBytesToRead / 2; x++)
- {
- //Store data into array
- data[dataSpot] = Wire.read() << 8; //MSB
- data[dataSpot] |= Wire.read(); //LSB
-
- dataSpot++;
- }
- }
-
- bytesRemaining -= numberOfBytesToRead;
-
- startAddress += numberOfBytesToRead / 2;
- }
-
- return (0); //Success
- }
- */
- //Set I2C Freq, in kHz
- //MLX90640_I2CFreqSet(1000) sets frequency to 1MHz
- void MLX90640_I2CFreqSet(int freq)
- {
- //i2c.frequency(1000 * freq);
- Wire.setClock((long)1000 * freq);
- }
-
- //Write two bytes to a two byte address
- int MLX90640_I2CWrite(uint8_t _deviceAddress, unsigned int writeAddress, uint16_t data)
- {
- Wire.beginTransmission((uint8_t)_deviceAddress);
- Wire.write(writeAddress >> 8); //MSB
- Wire.write(writeAddress & 0xFF); //LSB
- Wire.write(data >> 8); //MSB
- Wire.write(data & 0xFF); //LSB
- if (Wire.endTransmission() != 0)
- {
- //Sensor did not ACK
- Serial.println("Error: Sensor did not ack");
- return (0);//Sensor did not ACK
- }
-
- uint16_t dataCheck;
- MLX90640_I2CRead(_deviceAddress, writeAddress, 1, &dataCheck);
- if (dataCheck != data)
- {
- //Serial.println("The write request didn't stick");
- return -2;
- }
-
- return (0); //Success
- }
|