Peter Cooper
/
diags
test code for our MBED board
i2c.c@0:9edfcca7cd25, 2010-01-12 (annotated)
- Committer:
- lolpcc
- Date:
- Tue Jan 12 16:49:56 2010 +0000
- Revision:
- 0:9edfcca7cd25
- Child:
- 1:6877bb99aa17
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lolpcc | 0:9edfcca7cd25 | 1 | #include "mbed.h" |
lolpcc | 0:9edfcca7cd25 | 2 | #include "diags.h" |
lolpcc | 0:9edfcca7cd25 | 3 | |
lolpcc | 0:9edfcca7cd25 | 4 | I2C i2c(p9, p10); // sda, scl |
lolpcc | 0:9edfcca7cd25 | 5 | |
lolpcc | 0:9edfcca7cd25 | 6 | #define LCD 0xC6 |
lolpcc | 0:9edfcca7cd25 | 7 | #define SEVEN_SEG 0x70 |
lolpcc | 0:9edfcca7cd25 | 8 | #define PIO 0x40 |
lolpcc | 0:9edfcca7cd25 | 9 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 10 | /* */ |
lolpcc | 0:9edfcca7cd25 | 11 | /* Probe the I2C bus, and show the */ |
lolpcc | 0:9edfcca7cd25 | 12 | /* user what we have found */ |
lolpcc | 0:9edfcca7cd25 | 13 | /* */ |
lolpcc | 0:9edfcca7cd25 | 14 | /* */ |
lolpcc | 0:9edfcca7cd25 | 15 | /* */ |
lolpcc | 0:9edfcca7cd25 | 16 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 17 | void i2c_probe(void) |
lolpcc | 0:9edfcca7cd25 | 18 | { |
lolpcc | 0:9edfcca7cd25 | 19 | char buf[0x60]; |
lolpcc | 0:9edfcca7cd25 | 20 | sprintf(buf,"Searching for I2C devices...\n\r"); |
lolpcc | 0:9edfcca7cd25 | 21 | serial_output_string(buf); |
lolpcc | 0:9edfcca7cd25 | 22 | |
lolpcc | 0:9edfcca7cd25 | 23 | int count = 0; |
lolpcc | 0:9edfcca7cd25 | 24 | for (int address=4; address<256; address+=2) { |
lolpcc | 0:9edfcca7cd25 | 25 | if (!i2c.write(address, NULL, 0)) { // 0 returned is ok |
lolpcc | 0:9edfcca7cd25 | 26 | sprintf(buf," - I2C device found at address 0x%02X\n\r", address); |
lolpcc | 0:9edfcca7cd25 | 27 | serial_output_string(buf); |
lolpcc | 0:9edfcca7cd25 | 28 | count++; |
lolpcc | 0:9edfcca7cd25 | 29 | } |
lolpcc | 0:9edfcca7cd25 | 30 | } |
lolpcc | 0:9edfcca7cd25 | 31 | sprintf(buf,"%d devices found\n\r", count); |
lolpcc | 0:9edfcca7cd25 | 32 | serial_output_string(buf); |
lolpcc | 0:9edfcca7cd25 | 33 | } |
lolpcc | 0:9edfcca7cd25 | 34 | |
lolpcc | 0:9edfcca7cd25 | 35 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 36 | /* */ |
lolpcc | 0:9edfcca7cd25 | 37 | /* Should display some basic data */ |
lolpcc | 0:9edfcca7cd25 | 38 | /* on the LCD interface */ |
lolpcc | 0:9edfcca7cd25 | 39 | /* */ |
lolpcc | 0:9edfcca7cd25 | 40 | /* */ |
lolpcc | 0:9edfcca7cd25 | 41 | /* */ |
lolpcc | 0:9edfcca7cd25 | 42 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 43 | /* LCD tests */ |
lolpcc | 0:9edfcca7cd25 | 44 | void test_lcd(char t) |
lolpcc | 0:9edfcca7cd25 | 45 | { |
lolpcc | 0:9edfcca7cd25 | 46 | init_lcd(); |
lolpcc | 0:9edfcca7cd25 | 47 | clear_lcd(); |
lolpcc | 0:9edfcca7cd25 | 48 | write_lcd("this is a test"); |
lolpcc | 0:9edfcca7cd25 | 49 | } |
lolpcc | 0:9edfcca7cd25 | 50 | |
lolpcc | 0:9edfcca7cd25 | 51 | char init_lcd(void) |
lolpcc | 0:9edfcca7cd25 | 52 | { |
lolpcc | 0:9edfcca7cd25 | 53 | char buf[4]; |
lolpcc | 0:9edfcca7cd25 | 54 | buf[0]=0; |
lolpcc | 0:9edfcca7cd25 | 55 | buf[1]=19; |
lolpcc | 0:9edfcca7cd25 | 56 | return(i2c.write(LCD,buf,2)); |
lolpcc | 0:9edfcca7cd25 | 57 | } |
lolpcc | 0:9edfcca7cd25 | 58 | char clear_lcd(void) |
lolpcc | 0:9edfcca7cd25 | 59 | { |
lolpcc | 0:9edfcca7cd25 | 60 | char buf[4]; |
lolpcc | 0:9edfcca7cd25 | 61 | buf[0]=0; |
lolpcc | 0:9edfcca7cd25 | 62 | buf[1]=12; |
lolpcc | 0:9edfcca7cd25 | 63 | return(i2c.write(LCD,buf,2)); |
lolpcc | 0:9edfcca7cd25 | 64 | } |
lolpcc | 0:9edfcca7cd25 | 65 | char set_lcd(char line, char col) |
lolpcc | 0:9edfcca7cd25 | 66 | { |
lolpcc | 0:9edfcca7cd25 | 67 | char buf[4]; |
lolpcc | 0:9edfcca7cd25 | 68 | buf[0]=0; |
lolpcc | 0:9edfcca7cd25 | 69 | buf[1]=3; |
lolpcc | 0:9edfcca7cd25 | 70 | buf[2]=line; |
lolpcc | 0:9edfcca7cd25 | 71 | buf[3]=col; |
lolpcc | 0:9edfcca7cd25 | 72 | return(i2c.write(LCD,buf,4)); |
lolpcc | 0:9edfcca7cd25 | 73 | } |
lolpcc | 0:9edfcca7cd25 | 74 | char write_lcd(char *str) |
lolpcc | 0:9edfcca7cd25 | 75 | { |
lolpcc | 0:9edfcca7cd25 | 76 | char buf[0x60]; |
lolpcc | 0:9edfcca7cd25 | 77 | if(strlen(str)>50){ |
lolpcc | 0:9edfcca7cd25 | 78 | printf("Line length to long\n\r"); |
lolpcc | 0:9edfcca7cd25 | 79 | return(0); |
lolpcc | 0:9edfcca7cd25 | 80 | } |
lolpcc | 0:9edfcca7cd25 | 81 | sprintf(buf,"%c%s",'\0',str); |
lolpcc | 0:9edfcca7cd25 | 82 | buf[0]=0; |
lolpcc | 0:9edfcca7cd25 | 83 | return(i2c.write(LCD,buf,strlen(str)+1)); |
lolpcc | 0:9edfcca7cd25 | 84 | } |
lolpcc | 0:9edfcca7cd25 | 85 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 86 | /* */ |
lolpcc | 0:9edfcca7cd25 | 87 | /* Shoudl get some keys from the user */ |
lolpcc | 0:9edfcca7cd25 | 88 | /* pressing keys on the keypad */ |
lolpcc | 0:9edfcca7cd25 | 89 | /* and display this data on the LCD */ |
lolpcc | 0:9edfcca7cd25 | 90 | /* */ |
lolpcc | 0:9edfcca7cd25 | 91 | /* */ |
lolpcc | 0:9edfcca7cd25 | 92 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 93 | /* Keyboard test code here */ |
lolpcc | 0:9edfcca7cd25 | 94 | void test_kbd(void) |
lolpcc | 0:9edfcca7cd25 | 95 | { |
lolpcc | 0:9edfcca7cd25 | 96 | } |
lolpcc | 0:9edfcca7cd25 | 97 | char read_keyboard(void) |
lolpcc | 0:9edfcca7cd25 | 98 | { |
lolpcc | 0:9edfcca7cd25 | 99 | char buf[10]; |
lolpcc | 0:9edfcca7cd25 | 100 | i2c.read(LCD,buf,4); |
lolpcc | 0:9edfcca7cd25 | 101 | if(buf[1]!=0){ |
lolpcc | 0:9edfcca7cd25 | 102 | switch(buf[1]){ |
lolpcc | 0:9edfcca7cd25 | 103 | case 0x01 : |
lolpcc | 0:9edfcca7cd25 | 104 | return('1'); |
lolpcc | 0:9edfcca7cd25 | 105 | case 0x02 : |
lolpcc | 0:9edfcca7cd25 | 106 | return('2'); |
lolpcc | 0:9edfcca7cd25 | 107 | case 0x04 : |
lolpcc | 0:9edfcca7cd25 | 108 | return('3'); |
lolpcc | 0:9edfcca7cd25 | 109 | case 0x08 : |
lolpcc | 0:9edfcca7cd25 | 110 | return('4'); |
lolpcc | 0:9edfcca7cd25 | 111 | case 0x10 : |
lolpcc | 0:9edfcca7cd25 | 112 | return('5'); |
lolpcc | 0:9edfcca7cd25 | 113 | case 0x20 : |
lolpcc | 0:9edfcca7cd25 | 114 | return('6'); |
lolpcc | 0:9edfcca7cd25 | 115 | case 0x40 : |
lolpcc | 0:9edfcca7cd25 | 116 | return('7'); |
lolpcc | 0:9edfcca7cd25 | 117 | case 0x80 : |
lolpcc | 0:9edfcca7cd25 | 118 | return('8'); |
lolpcc | 0:9edfcca7cd25 | 119 | } |
lolpcc | 0:9edfcca7cd25 | 120 | } |
lolpcc | 0:9edfcca7cd25 | 121 | if(buf[2]!=0){ |
lolpcc | 0:9edfcca7cd25 | 122 | switch(buf[2]){ |
lolpcc | 0:9edfcca7cd25 | 123 | case 0x01 : |
lolpcc | 0:9edfcca7cd25 | 124 | return('9'); |
lolpcc | 0:9edfcca7cd25 | 125 | case 0x02 : |
lolpcc | 0:9edfcca7cd25 | 126 | return('*'); |
lolpcc | 0:9edfcca7cd25 | 127 | case 0x04 : |
lolpcc | 0:9edfcca7cd25 | 128 | return('0'); |
lolpcc | 0:9edfcca7cd25 | 129 | case 0x08 : |
lolpcc | 0:9edfcca7cd25 | 130 | return('#'); |
lolpcc | 0:9edfcca7cd25 | 131 | } |
lolpcc | 0:9edfcca7cd25 | 132 | } |
lolpcc | 0:9edfcca7cd25 | 133 | return('\0'); |
lolpcc | 0:9edfcca7cd25 | 134 | } |
lolpcc | 0:9edfcca7cd25 | 135 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 136 | /* */ |
lolpcc | 0:9edfcca7cd25 | 137 | /* Should read and write data on the */ |
lolpcc | 0:9edfcca7cd25 | 138 | /* PCF8574 I/O expander, maybe with */ |
lolpcc | 0:9edfcca7cd25 | 139 | /* a loop back connector in time */ |
lolpcc | 0:9edfcca7cd25 | 140 | /* */ |
lolpcc | 0:9edfcca7cd25 | 141 | /* */ |
lolpcc | 0:9edfcca7cd25 | 142 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 143 | /* PCF8574 tests */ |
lolpcc | 0:9edfcca7cd25 | 144 | void test_pio(char t) |
lolpcc | 0:9edfcca7cd25 | 145 | { |
lolpcc | 0:9edfcca7cd25 | 146 | } |
lolpcc | 0:9edfcca7cd25 | 147 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 148 | /* */ |
lolpcc | 0:9edfcca7cd25 | 149 | /* Send some data to the seven segment */ |
lolpcc | 0:9edfcca7cd25 | 150 | /* display device, showing the user */ |
lolpcc | 0:9edfcca7cd25 | 151 | /* what the SAA1064 can do */ |
lolpcc | 0:9edfcca7cd25 | 152 | /* */ |
lolpcc | 0:9edfcca7cd25 | 153 | /* */ |
lolpcc | 0:9edfcca7cd25 | 154 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 155 | |
lolpcc | 0:9edfcca7cd25 | 156 | /* mapping of bit pattern to number 0-9 */ |
lolpcc | 0:9edfcca7cd25 | 157 | char sseg_map[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67}; |
lolpcc | 0:9edfcca7cd25 | 158 | |
lolpcc | 0:9edfcca7cd25 | 159 | void test_seven_seg(char loop) |
lolpcc | 0:9edfcca7cd25 | 160 | { |
lolpcc | 0:9edfcca7cd25 | 161 | unsigned char buf[10]; |
lolpcc | 0:9edfcca7cd25 | 162 | char a,b,c; |
lolpcc | 0:9edfcca7cd25 | 163 | |
lolpcc | 0:9edfcca7cd25 | 164 | buf[0]=0; |
lolpcc | 0:9edfcca7cd25 | 165 | buf[1]=0x27; |
lolpcc | 0:9edfcca7cd25 | 166 | c=0; |
lolpcc | 0:9edfcca7cd25 | 167 | i2c.write(SEVEN_SEG,(char *)buf,7); |
lolpcc | 0:9edfcca7cd25 | 168 | while(c!=loop){ |
lolpcc | 0:9edfcca7cd25 | 169 | a = 1; |
lolpcc | 0:9edfcca7cd25 | 170 | b = 0; |
lolpcc | 0:9edfcca7cd25 | 171 | while(b!=8){ |
lolpcc | 0:9edfcca7cd25 | 172 | buf[2]=a<<b; |
lolpcc | 0:9edfcca7cd25 | 173 | buf[3]=a<<b; |
lolpcc | 0:9edfcca7cd25 | 174 | buf[4]=a<<b; |
lolpcc | 0:9edfcca7cd25 | 175 | buf[5]=a<<b; |
lolpcc | 0:9edfcca7cd25 | 176 | i2c.write(SEVEN_SEG,(char *)buf,7); |
lolpcc | 0:9edfcca7cd25 | 177 | wait(0.5); |
lolpcc | 0:9edfcca7cd25 | 178 | b++; |
lolpcc | 0:9edfcca7cd25 | 179 | } |
lolpcc | 0:9edfcca7cd25 | 180 | c++; |
lolpcc | 0:9edfcca7cd25 | 181 | } |
lolpcc | 0:9edfcca7cd25 | 182 | } |
lolpcc | 0:9edfcca7cd25 | 183 | |
lolpcc | 0:9edfcca7cd25 | 184 | void print_seven_seg(unsigned char a,unsigned char b,unsigned char c,unsigned char d) |
lolpcc | 0:9edfcca7cd25 | 185 | { |
lolpcc | 0:9edfcca7cd25 | 186 | unsigned char buf[10]; |
lolpcc | 0:9edfcca7cd25 | 187 | |
lolpcc | 0:9edfcca7cd25 | 188 | buf[0]=0; |
lolpcc | 0:9edfcca7cd25 | 189 | buf[1]=0x27; |
lolpcc | 0:9edfcca7cd25 | 190 | buf[2]=a; |
lolpcc | 0:9edfcca7cd25 | 191 | buf[3]=b; |
lolpcc | 0:9edfcca7cd25 | 192 | buf[4]=d; /* Digits 3 and 4 are the wrong way round */ |
lolpcc | 0:9edfcca7cd25 | 193 | buf[5]=c; |
lolpcc | 0:9edfcca7cd25 | 194 | i2c.write(SEVEN_SEG,(char *)buf,7); |
lolpcc | 0:9edfcca7cd25 | 195 | } |
lolpcc | 0:9edfcca7cd25 | 196 | |
lolpcc | 0:9edfcca7cd25 | 197 | void sseg_ticker_test(int t) |
lolpcc | 0:9edfcca7cd25 | 198 | { |
lolpcc | 0:9edfcca7cd25 | 199 | char a,b,c,d; |
lolpcc | 0:9edfcca7cd25 | 200 | int z; |
lolpcc | 0:9edfcca7cd25 | 201 | |
lolpcc | 0:9edfcca7cd25 | 202 | a = sseg_map[t/1000]; |
lolpcc | 0:9edfcca7cd25 | 203 | z = t%1000; |
lolpcc | 0:9edfcca7cd25 | 204 | b = sseg_map[z/100]; |
lolpcc | 0:9edfcca7cd25 | 205 | z = z%100; |
lolpcc | 0:9edfcca7cd25 | 206 | c = sseg_map[z/10]; |
lolpcc | 0:9edfcca7cd25 | 207 | z = z%10; |
lolpcc | 0:9edfcca7cd25 | 208 | d = sseg_map[z]; |
lolpcc | 0:9edfcca7cd25 | 209 | print_seven_seg(a,b,c,d); |
lolpcc | 0:9edfcca7cd25 | 210 | } |