Darley Gonzalez
/
I2C_Slave
Programa
Revision 0:782b008e3b3a, committed 2021-03-02
- Comitter:
- darley_gonzalez
- Date:
- Tue Mar 02 22:37:23 2021 +0000
- Commit message:
- I2c Slave
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q.cpp Tue Mar 02 22:37:23 2021 +0000 @@ -0,0 +1,64 @@ +#include "MMA8451Q.h" + +#define REG_WHO_AM_I 0x0D +#define REG_CTRL_REG_1 0x2A +#define REG_OUT_X_MSB 0x01 +#define REG_OUT_Y_MSB 0x03 +#define REG_OUT_Z_MSB 0x05 + +#define UINT14_MAX 16383 + +MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) { + // activate the peripheral + uint8_t data[2] = {REG_CTRL_REG_1, 0x01}; + writeRegs(data, 2); +} + +MMA8451Q::~MMA8451Q() { } + +uint8_t MMA8451Q::getWhoAmI() { + uint8_t who_am_i = 0; + readRegs(REG_WHO_AM_I, &who_am_i, 1); + return who_am_i; +} + +float MMA8451Q::getAccX() { + return (float(getAccAxis(REG_OUT_X_MSB))/4096.0); +} + +float MMA8451Q::getAccY() { + return (float(getAccAxis(REG_OUT_Y_MSB))/4096.0); +} + +float MMA8451Q::getAccZ() { + return (float(getAccAxis(REG_OUT_Z_MSB))/4096.0); +} + +void MMA8451Q::getAccAllAxis(float * res) { + res[0] = getAccX(); + res[1] = getAccY(); + res[2] = getAccZ(); +} + +int16_t MMA8451Q::getAccAxis(uint8_t addr) { + int16_t acc; + uint8_t res[2]; + readRegs(addr, res, 2); + + acc = (res[0] << 6) | (res[1] >> 2); + if (acc > UINT14_MAX/2) + acc -= UINT14_MAX; + + return acc; +} + +void MMA8451Q::readRegs(int addr, uint8_t * data, int len) { + char t[1] = {0}; + t[1] =addr; + m_i2c.write(m_addr, t, 1, true); + m_i2c.read(m_addr, (char *)data, len); +} + +void MMA8451Q::writeRegs(uint8_t * data, int len) { + m_i2c.write(m_addr, (char *)data, len); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q.h Tue Mar 02 22:37:23 2021 +0000 @@ -0,0 +1,92 @@ +#ifndef MMA8451Q_H +#define MMA8451Q_H + +#include "mbed.h" + +/** +* MMA8451Q accelerometer example +* +* @code +* #include "mbed.h" +* #include "MMA8451Q.h" +* +* #define MMA8451_I2C_ADDRESS (0x1d<<1) +* +* int main(void) { +* +* MMA8451Q acc(P_E25, P_E24, MMA8451_I2C_ADDRESS); +* PwmOut rled(LED_RED); +* PwmOut gled(LED_GREEN); +* PwmOut bled(LED_BLUE); +* +* while (true) { +* rled = 1.0 - abs(acc.getAccX()); +* gled = 1.0 - abs(acc.getAccY()); +* bled = 1.0 - abs(acc.getAccZ()); +* wait(0.1); +* } +* } +* @endcode +*/ +class MMA8451Q +{ +public: + /** + * MMA8451Q constructor + * + * @param sda SDA pin + * @param sdl SCL pin + * @param addr addr of the I2C peripheral + */ + MMA8451Q(PinName sda, PinName scl, int addr); + + /** + * MMA8451Q destructor + */ + ~MMA8451Q(); + + /** + * Get the value of the WHO_AM_I register + * + * @returns WHO_AM_I value + */ + uint8_t getWhoAmI(); + + /** + * Get X axis acceleration + * + * @returns X axis acceleration + */ + float getAccX(); + + /** + * Get Y axis acceleration + * + * @returns Y axis acceleration + */ + float getAccY(); + + /** + * Get Z axis acceleration + * + * @returns Z axis acceleration + */ + float getAccZ(); + + /** + * Get XYZ axis acceleration + * + * @param res array where acceleration data will be stored + */ + void getAccAllAxis(float * res); + +private: + I2C m_i2c; + int m_addr; + void readRegs(int addr, uint8_t * data, int len); + void writeRegs(uint8_t * data, int len); + int16_t getAccAxis(uint8_t addr); + +}; + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 02 22:37:23 2021 +0000 @@ -0,0 +1,72 @@ +#include "MMA8451Q.h" +#include "mbed.h" + +#if defined(TARGET_KL25Z) || defined(TARGET_KL46Z) +PinName const SDA = PTE25; +PinName const SCL = PTE24; //pines acelerometro +#elif defined(TARGET_KL05Z) +PinName const SDA = PTB4; +PinName const SCL = PTB3; +#elif defined(TARGET_K20D50M) +PinName const SDA = PTB1; +PinName const SCL = PTB0; +#else +#error TARGET NOT DEFINED +#endif +#define MMA8451_I2C_ADDRESS (0x1d << 1) +I2CSlave slave(PTE0, PTE1); +MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); +PwmOut rled(D3); +PwmOut gled(D4); +PwmOut bled(D5); +Serial pc(USBTX, USBRX); + +DigitalOut led1(LED2); + +float datos() +{ + float x, y, z; + x = abs(acc.getAccX()); + y = abs(acc.getAccY()); + z = abs(acc.getAccZ()); + rled = 1.0f - x; + gled = 1.0f - y; + bled = 1.0f - z; + wait_us(100000); + return y; + // printf("X: %f, Y: %f, Z: %f\n", x,y,z); +} +int main(void) +{ + MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); + PwmOut rled(D3); + PwmOut gled(D4); + PwmOut bled(D5); + char buf[13]; //recibir datos para guardar en un buffer + printf("MMA8451 ID: %d\n", acc.getWhoAmI()); //identifica que el sensor esta en funcionamiento en serial + slave.address(0xA0); //10100000 + while (true) { +// 10 0111 110 0100 + int i = slave.receive(); + switch (i) { + case I2CSlave::WriteAddressed: + slave.read(buf, 13); + // sprintf(buf, "%f\n", datos); + float x, y, z; //enviar datos de acelerometro + x = abs(acc.getAccX()); + y = abs(acc.getAccY()); + z = abs(acc.getAccZ()); + sprintf(buf,"%f%f%f\n",x,y,z); + pc.printf("%f%f%f\n",x,y,z); + + printf("%s\n", buf); + slave.write(buf, 13); + led1 = !led1; + break; //rompe el ciclo y reinicia el buffer + } + + for (int i = 0; i < 10; i++) { + buf[i] = 0; // Clear buffer + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Mar 02 22:37:23 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file