Hallo,
ich habe in meiner Sammlung ein kleines Beispiel für einen 24LC256 EEPROM, ist allerdings für den LPC1768 konfiguriert. Man muss die Pin Bezeichnungen für einen Nucleo anpassen, auch hat der nur eine LED. Aber es ist das schöne an mbed, dass die Programme mit so wenigen Änderungen auf Cortex-M verschiedener Hersteller laufen.
Headerdatei
Code:
#ifndef I2C_EEPROM_H
#define I2C_EEPROM_H
#include <vector>
//
// Klasse für 24LC256 usw.
//
class I2C_Memory {
private:
int m_Address;
I2C m_i2c;
bool m_Ok;
//
// Übertragungsfehler merken
//
void DoWrite(int value) {
if (!m_i2c.write(value))
m_Ok = false;
}
public:
//
// Konstruktor
//
I2C_Memory(int address, PinName sda, PinName scl) : m_Address(address), m_i2c(sda, scl), m_Ok(true)
{}
//
// Schreiben
//
bool Write(unsigned short start_address, const std::vector<uint8_t>& data) {
m_Ok = true;
char hb = (start_address & 0xff00) >> 8;
char lb = start_address & 0xff;
m_i2c.start();
DoWrite(m_Address);
DoWrite(hb);
DoWrite(lb);
for(unsigned int i = 0; i < data.size(); i++) {
DoWrite(data[i]);
}
m_i2c.stop();
return m_Ok;
}
//
// Lesen
//
bool Read(unsigned int start_address, unsigned int count, std::vector<uint8_t>& data) {
m_Ok = true;
data.clear();
char hb = (start_address & 0xff00) >> 8;
char lb = start_address & 0xff;
m_i2c.start();
DoWrite(m_Address);
DoWrite(hb);
DoWrite(lb);
m_i2c.start();
DoWrite(m_Address + 1);
for(unsigned int i = 0; i < count - 1; i++) {
data.push_back(m_i2c.read(1));
}
if ( count > 0 ) {
data.push_back(m_i2c.read(0)); // Letztes Lesen mit NACK quittieren
}
m_i2c.stop();
return m_Ok;
}
};
#endif
Beispielprogramm
Code:
#include "mbed.h"
#include "I2C_EEPROM.h"
I2C i2c(p9, p10);
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
int main() {
I2C_Memory memory(0xa0, p9, p10);
while(1) {
led1 = 0;
led2 = 0;
led3 = 0;
wait(1.0);
std::vector<uint8_t> data;
if ( memory.Read(0, 256, data) ) {
led1 = 1;
for(int i = 0; i < data.size(); i++) {
printf("%0.2x ", data[i]);
}
printf("\r\n\r\n");
}
else {
led2 = 1;
}
wait(5.0);
}
}
Lesezeichen