Advertisement
Guest User

Untitled

a guest
Oct 28th, 2012
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.11 KB | None | 0 0
  1. #define UART_BAUD_RATE      9600
  2.  
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <avr/io.h>
  6. #include <avr/interrupt.h>
  7. #include <avr/pgmspace.h>
  8. #include <util/delay.h>
  9.  
  10. #include "uart.h"
  11. #include "i2cmaster.h"
  12.  
  13. char linebuffer[80];
  14. char tmpbuffer[2] = " ";
  15.  
  16. char uart_recv()
  17. {
  18.     unsigned int c = UART_NO_DATA;
  19.  
  20.     while ( c & UART_NO_DATA )
  21.         c = uart_getc(); // wait for data
  22.  
  23.     if ( c & UART_FRAME_ERROR )
  24.         uart_puts_P("UART Frame Error: ");
  25.     if ( c & UART_OVERRUN_ERROR )
  26.         uart_puts_P("UART Overrun Error: ");
  27.     if ( c & UART_BUFFER_OVERFLOW )
  28.         uart_puts_P("Buffer overflow error: ");
  29.  
  30.     return c;
  31. }
  32.  
  33. void discover()
  34. {
  35.     uart_puts_P("Discovering i2c devices...\r\n");
  36.  
  37.     for (uint16_t i = 16; i < 240; i=i+2)
  38.     {
  39.         uint8_t ret = i2c_start(i);
  40.  
  41.         if(!ret)
  42.         {
  43.             char tmp[8];
  44.             itoa(i&(~1),tmp,16);
  45.             uart_puts_P("Found device with adress: 0x");
  46.             uart_puts(tmp);
  47.             uart_puts_P("\r\n");
  48.         }
  49.  
  50.         i2c_stop();
  51.     }
  52. }
  53.  
  54.  
  55. void setAddress(uint8_t device_address, uint16_t memory_address)
  56. {
  57.     uint8_t ret = i2c_start(device_address + I2C_WRITE);
  58.     if(ret)
  59.     {
  60.         i2c_stop();
  61.         uart_puts_P("Writing failed.\r\n");
  62.         return;
  63.     }
  64.  
  65.     i2c_write(memory_address >> 8);
  66.     i2c_write(memory_address);
  67. }
  68.  
  69.  
  70. void read(uint8_t device_address, uint16_t cnt)
  71. {
  72.     uint8_t ret = i2c_rep_start(device_address + I2C_READ);
  73.  
  74.     if(ret)
  75.     {
  76.         i2c_stop();
  77.         uart_puts_P("Reading failed.\r\n");
  78.         return;
  79.     }
  80.  
  81.     for (uint16_t i = 0; i < cnt; ++i)
  82.     {
  83.         if(i%16 == 0)
  84.             uart_puts_P("\r\n");
  85.  
  86.         ret = i2c_readAck();
  87.  
  88.         if(ret < 16)
  89.             uart_putc('0');
  90.  
  91.         char tmp[8];
  92.         itoa(ret,tmp,16);
  93.         uart_puts(tmp);
  94.         uart_putc(' ');
  95.     }
  96.  
  97.     i2c_readNak();
  98.     i2c_stop();
  99.     uart_puts_P("\r\n\r\n");
  100. }
  101.  
  102.  
  103. void write(uint8_t device_address)
  104. {
  105.     uint8_t val = 0;
  106.     uint16_t cnt = 0;
  107.     while(1)
  108.     {
  109.         // receive a line
  110.         linebuffer[0] = '\0';
  111.         tmpbuffer[0] = '\0';
  112.         while(tmpbuffer[0] != '\r')
  113.         {
  114.             tmpbuffer[0] = uart_recv();
  115.             uart_putc(tmpbuffer[0]);
  116.             strcat(linebuffer, tmpbuffer);
  117.         }
  118.  
  119.         uart_putc('\n');
  120.  
  121.         if(linebuffer[0] == 'q')
  122.             break;
  123.  
  124.         // parse line and write data
  125.         char* end = linebuffer;
  126.         while(end[0] != '\r')
  127.         {
  128.             val = strtoul(end, &end, 16);
  129.             uint8_t err = i2c_write(val);
  130.             if(err)
  131.             {
  132.                 i2c_stop();
  133.                 uart_puts_P("Error while writing.\r\n");
  134.                 return;
  135.             }
  136.             ++cnt;
  137.         }
  138.     }
  139.  
  140.     i2c_stop();
  141.  
  142.     char tmp[8];
  143.     itoa(cnt,tmp,16);
  144.     uart_puts(tmp);
  145.     uart_puts_P(" Bytes were written\r\n");
  146. }
  147.  
  148.  
  149. void sniff(uint8_t d_add, uint16_t count)
  150. {
  151.     TWAR = d_add & ~1;
  152.  
  153.     for(uint16_t i = 0; i < count; ++i)
  154.     {
  155.         // start twi interface
  156.         TWCR = (1<<TWEA) | (1<<TWEN) | (1<<TWINT);
  157.  
  158.         while(!(TWCR & (1<<TWINT)));
  159.  
  160.         // check if receiving or transmitting
  161.         if(TWSR == 0x60)
  162.             uart_puts_P("receiving: ");
  163.         else if(TWSR == 0xA8)
  164.         {
  165.             uart_puts_P("transmitting something\r\n");
  166.             TWCR = (1<<TWINT);
  167.             continue;
  168.         }
  169.  
  170.         // if receiving, print the received bytes
  171.         char tmp[3];
  172.         while(TWSR != 0xA0)
  173.         {
  174.             TWCR = (1<<TWEN) | (1<<TWINT);
  175.  
  176.             while(!(TWCR & (1<<TWINT)));
  177.  
  178.             if(TWSR == 0x80 || TWSR == 0x88 )
  179.             {
  180.                 itoa(TWDR,tmp,16);
  181.                 uart_puts(tmp);
  182.                 uart_putc(' ');
  183.             }
  184.         }
  185.  
  186.         uart_puts_P("\r\n");
  187.     }
  188.  
  189.     TWAR = 0x00;
  190. }
  191.  
  192. int main(void)
  193. {
  194.     DDRC = 0x00;
  195.     PORTC &= ~(0x04);
  196.  
  197.     linebuffer[0] = '\0';
  198.  
  199.     uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
  200.     i2c_init();
  201.  
  202.     sei();
  203.  
  204.     uart_putc('>');
  205.  
  206.     for(;;)
  207.     {
  208.         tmpbuffer[0] = uart_recv();
  209.         uart_putc(tmpbuffer[0]);
  210.         strcat(linebuffer, tmpbuffer);
  211.  
  212.         if(tmpbuffer[0] == '\r') // new line received
  213.         {
  214.             uart_putc('\n');
  215.  
  216.             if( strstr(linebuffer, "help") == linebuffer )
  217.             {
  218.                 uart_puts_P("Available commands:\r\n");
  219.                 uart_puts_P("  discover - find devices on the bus\r\n");
  220.                 uart_puts_P("      read - read memory from an eeprom\r\n");
  221.                 uart_puts_P("     write - write data to an eeprom\r\n");
  222.                 uart_puts_P("     sniff - monitor the bus\r\n");
  223.             }
  224.             else if( strstr(linebuffer, "discover") == linebuffer )
  225.             {
  226.                 DDRC |= 0x04; // mute other masters on bus
  227.                 _delay_ms(100);
  228.  
  229.                 discover();
  230.  
  231.                 DDRC &= ~(0x04);
  232.             }
  233.             else if( strstr(linebuffer, "read ") == linebuffer )
  234.             {
  235.                 DDRC |= 0x04; // mute other masters on bus
  236.                 _delay_ms(100);
  237.  
  238.                 char* end = linebuffer + 5;
  239.                 uint8_t d_add = strtoul(end, &end, 16);
  240.                 uint16_t m_add = strtoul(end, &end, 16);
  241.                 uint16_t cnt = strtoul(end, &end, 10);
  242.  
  243.                 setAddress(d_add, m_add);
  244.                 read(d_add, cnt);
  245.  
  246.                 DDRC &= ~(0x04);
  247.             }
  248.             else if( strstr(linebuffer, "write ") == linebuffer )
  249.             {
  250.                 DDRC |= 0x04; // mute other masters on bus
  251.  
  252.                 _delay_ms(100);
  253.  
  254.                 char* end = linebuffer + 6;
  255.                 uint8_t d_add = strtoul(end, &end, 16);
  256.                 uint16_t m_add = strtoul(end, &end, 16);
  257.  
  258.                 setAddress(d_add, m_add);
  259.                 write(d_add);
  260.  
  261.                 DDRC &= ~(0x04);
  262.             }
  263.             else if( strstr(linebuffer, "sniff ") == linebuffer )
  264.             {
  265.                 char* end = linebuffer + 6;
  266.                 uint8_t d_add = strtoul(end, &end, 16);
  267.                 uint16_t count = strtoul(end, &end, 10);
  268.                 sniff(d_add, count);
  269.             }
  270.             else
  271.                 uart_puts_P("Unknown command\r\n");
  272.  
  273.             linebuffer[0] = '\0';
  274.             uart_putc('>');
  275.         }
  276.     }
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement