Gabriel Silva
/
mlx90615_lpc1768
program for temperature reading with mlx90615
smbus.cpp@0:db513e91a2c9, 2020-07-15 (annotated)
- Committer:
- glsfacom
- Date:
- Wed Jul 15 18:20:00 2020 +0000
- Revision:
- 0:db513e91a2c9
export to mbed studio;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
glsfacom | 0:db513e91a2c9 | 1 | #include "smbus.h" |
glsfacom | 0:db513e91a2c9 | 2 | |
glsfacom | 0:db513e91a2c9 | 3 | void smbus_start() |
glsfacom | 0:db513e91a2c9 | 4 | { |
glsfacom | 0:db513e91a2c9 | 5 | i2c.start(); |
glsfacom | 0:db513e91a2c9 | 6 | } |
glsfacom | 0:db513e91a2c9 | 7 | |
glsfacom | 0:db513e91a2c9 | 8 | void smbus_stop() |
glsfacom | 0:db513e91a2c9 | 9 | { |
glsfacom | 0:db513e91a2c9 | 10 | i2c.stop(); |
glsfacom | 0:db513e91a2c9 | 11 | } |
glsfacom | 0:db513e91a2c9 | 12 | |
glsfacom | 0:db513e91a2c9 | 13 | unsigned char smbus_send_byte(unsigned char byte) |
glsfacom | 0:db513e91a2c9 | 14 | { |
glsfacom | 0:db513e91a2c9 | 15 | return i2c.write(byte); |
glsfacom | 0:db513e91a2c9 | 16 | } |
glsfacom | 0:db513e91a2c9 | 17 | |
glsfacom | 0:db513e91a2c9 | 18 | unsigned char smbus_send_address(unsigned char address, unsigned char rw) |
glsfacom | 0:db513e91a2c9 | 19 | { |
glsfacom | 0:db513e91a2c9 | 20 | unsigned char addr = address << 1; |
glsfacom | 0:db513e91a2c9 | 21 | addr = addr + rw; |
glsfacom | 0:db513e91a2c9 | 22 | |
glsfacom | 0:db513e91a2c9 | 23 | return smbus_send_byte(addr); |
glsfacom | 0:db513e91a2c9 | 24 | } |
glsfacom | 0:db513e91a2c9 | 25 | |
glsfacom | 0:db513e91a2c9 | 26 | unsigned char smbus_read_byte(unsigned char *status) |
glsfacom | 0:db513e91a2c9 | 27 | { |
glsfacom | 0:db513e91a2c9 | 28 | unsigned char byte; |
glsfacom | 0:db513e91a2c9 | 29 | |
glsfacom | 0:db513e91a2c9 | 30 | byte = i2c.read(i2c.ACK); |
glsfacom | 0:db513e91a2c9 | 31 | |
glsfacom | 0:db513e91a2c9 | 32 | |
glsfacom | 0:db513e91a2c9 | 33 | return byte; |
glsfacom | 0:db513e91a2c9 | 34 | } |
glsfacom | 0:db513e91a2c9 | 35 | |
glsfacom | 0:db513e91a2c9 | 36 | unsigned int smbus_read_uint(unsigned char *status, unsigned char read_mode){ |
glsfacom | 0:db513e91a2c9 | 37 | |
glsfacom | 0:db513e91a2c9 | 38 | unsigned char byte0, byte1, low, high, sts = 0; |
glsfacom | 0:db513e91a2c9 | 39 | unsigned int value = 0x0000; |
glsfacom | 0:db513e91a2c9 | 40 | |
glsfacom | 0:db513e91a2c9 | 41 | |
glsfacom | 0:db513e91a2c9 | 42 | byte0 = smbus_read_byte(&sts); |
glsfacom | 0:db513e91a2c9 | 43 | *status = sts; |
glsfacom | 0:db513e91a2c9 | 44 | |
glsfacom | 0:db513e91a2c9 | 45 | if(*status != 0x8B) |
glsfacom | 0:db513e91a2c9 | 46 | return 0; |
glsfacom | 0:db513e91a2c9 | 47 | |
glsfacom | 0:db513e91a2c9 | 48 | byte1 = smbus_read_byte(&sts); |
glsfacom | 0:db513e91a2c9 | 49 | *status = sts; |
glsfacom | 0:db513e91a2c9 | 50 | |
glsfacom | 0:db513e91a2c9 | 51 | if(read_mode == BIG_ENDIAN){ |
glsfacom | 0:db513e91a2c9 | 52 | high = byte0; |
glsfacom | 0:db513e91a2c9 | 53 | low = byte1; |
glsfacom | 0:db513e91a2c9 | 54 | } |
glsfacom | 0:db513e91a2c9 | 55 | else{ |
glsfacom | 0:db513e91a2c9 | 56 | high = byte1; |
glsfacom | 0:db513e91a2c9 | 57 | low = byte0; |
glsfacom | 0:db513e91a2c9 | 58 | } |
glsfacom | 0:db513e91a2c9 | 59 | |
glsfacom | 0:db513e91a2c9 | 60 | value |= low; |
glsfacom | 0:db513e91a2c9 | 61 | value |= high<<8; |
glsfacom | 0:db513e91a2c9 | 62 | |
glsfacom | 0:db513e91a2c9 | 63 | return value; |
glsfacom | 0:db513e91a2c9 | 64 | |
glsfacom | 0:db513e91a2c9 | 65 | } |
glsfacom | 0:db513e91a2c9 | 66 | |
glsfacom | 0:db513e91a2c9 | 67 | unsigned char smbus_write_uint(unsigned char read_mode, unsigned int value){ |
glsfacom | 0:db513e91a2c9 | 68 | |
glsfacom | 0:db513e91a2c9 | 69 | unsigned char lsb, msb, byte0, byte1, status; |
glsfacom | 0:db513e91a2c9 | 70 | |
glsfacom | 0:db513e91a2c9 | 71 | lsb = value; |
glsfacom | 0:db513e91a2c9 | 72 | msb = value >> 8; |
glsfacom | 0:db513e91a2c9 | 73 | |
glsfacom | 0:db513e91a2c9 | 74 | if(read_mode == BIG_ENDIAN){ |
glsfacom | 0:db513e91a2c9 | 75 | byte0 = msb; |
glsfacom | 0:db513e91a2c9 | 76 | byte1 = lsb; |
glsfacom | 0:db513e91a2c9 | 77 | } |
glsfacom | 0:db513e91a2c9 | 78 | else{ |
glsfacom | 0:db513e91a2c9 | 79 | byte1 = msb; |
glsfacom | 0:db513e91a2c9 | 80 | byte0 = lsb; |
glsfacom | 0:db513e91a2c9 | 81 | } |
glsfacom | 0:db513e91a2c9 | 82 | |
glsfacom | 0:db513e91a2c9 | 83 | status = smbus_send_byte(byte0); |
glsfacom | 0:db513e91a2c9 | 84 | if(!i2c.ACK) return status; |
glsfacom | 0:db513e91a2c9 | 85 | |
glsfacom | 0:db513e91a2c9 | 86 | status = smbus_send_byte(byte1); |
glsfacom | 0:db513e91a2c9 | 87 | return status; |
glsfacom | 0:db513e91a2c9 | 88 | |
glsfacom | 0:db513e91a2c9 | 89 | |
glsfacom | 0:db513e91a2c9 | 90 | } |
glsfacom | 0:db513e91a2c9 | 91 |