streaming server for AM/FM radio via UDP connection.

Dependencies:   mbed EthernetNetIf

Committer:
soramimi
Date:
Thu Aug 30 08:35:20 2012 +0000
Revision:
2:3b6816fd4ae6
Parent:
0:bd865e5a3df3

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
soramimi 0:bd865e5a3df3 1 #include "mbed.h"
soramimi 0:bd865e5a3df3 2
soramimi 0:bd865e5a3df3 3 //I2C i2c(p9, p10); // sda, scl
soramimi 0:bd865e5a3df3 4
soramimi 0:bd865e5a3df3 5 DigitalInOut i2c_sda(p9);
soramimi 0:bd865e5a3df3 6 DigitalInOut i2c_scl(p10);
soramimi 0:bd865e5a3df3 7
soramimi 0:bd865e5a3df3 8 void wait10us()
soramimi 0:bd865e5a3df3 9 {
soramimi 0:bd865e5a3df3 10 wait(0.000001);
soramimi 0:bd865e5a3df3 11 }
soramimi 0:bd865e5a3df3 12
soramimi 0:bd865e5a3df3 13 void wait10ms()
soramimi 0:bd865e5a3df3 14 {
soramimi 0:bd865e5a3df3 15 wait(0.001);
soramimi 0:bd865e5a3df3 16 }
soramimi 0:bd865e5a3df3 17
soramimi 0:bd865e5a3df3 18 void wait100ms()
soramimi 0:bd865e5a3df3 19 {
soramimi 0:bd865e5a3df3 20 wait(0.01);
soramimi 0:bd865e5a3df3 21 }
soramimi 0:bd865e5a3df3 22
soramimi 0:bd865e5a3df3 23
soramimi 0:bd865e5a3df3 24
soramimi 0:bd865e5a3df3 25 #if 1
soramimi 0:bd865e5a3df3 26
soramimi 0:bd865e5a3df3 27 // i2c
soramimi 0:bd865e5a3df3 28
soramimi 0:bd865e5a3df3 29 void i2c_cl_0()
soramimi 0:bd865e5a3df3 30 {
soramimi 0:bd865e5a3df3 31 i2c_scl.output();
soramimi 0:bd865e5a3df3 32 }
soramimi 0:bd865e5a3df3 33
soramimi 0:bd865e5a3df3 34 void i2c_cl_1()
soramimi 0:bd865e5a3df3 35 {
soramimi 0:bd865e5a3df3 36 i2c_scl.input();
soramimi 0:bd865e5a3df3 37 }
soramimi 0:bd865e5a3df3 38
soramimi 0:bd865e5a3df3 39 void i2c_da_0()
soramimi 0:bd865e5a3df3 40 {
soramimi 0:bd865e5a3df3 41 i2c_sda.output();
soramimi 0:bd865e5a3df3 42 }
soramimi 0:bd865e5a3df3 43
soramimi 0:bd865e5a3df3 44 void i2c_da_1()
soramimi 0:bd865e5a3df3 45 {
soramimi 0:bd865e5a3df3 46 i2c_sda.input();
soramimi 0:bd865e5a3df3 47 }
soramimi 0:bd865e5a3df3 48
soramimi 0:bd865e5a3df3 49 int i2c_get_da()
soramimi 0:bd865e5a3df3 50 {
soramimi 0:bd865e5a3df3 51 return i2c_sda.read();
soramimi 0:bd865e5a3df3 52 }
soramimi 0:bd865e5a3df3 53
soramimi 0:bd865e5a3df3 54 void i2c_start()
soramimi 0:bd865e5a3df3 55 {
soramimi 0:bd865e5a3df3 56 i2c_da_0();
soramimi 0:bd865e5a3df3 57 wait10us();
soramimi 0:bd865e5a3df3 58 i2c_cl_0();
soramimi 0:bd865e5a3df3 59 wait10us();
soramimi 0:bd865e5a3df3 60 }
soramimi 0:bd865e5a3df3 61
soramimi 0:bd865e5a3df3 62 void i2c_stop()
soramimi 0:bd865e5a3df3 63 {
soramimi 0:bd865e5a3df3 64 i2c_cl_1();
soramimi 0:bd865e5a3df3 65 wait10us();
soramimi 0:bd865e5a3df3 66 i2c_da_1();
soramimi 0:bd865e5a3df3 67 wait10us();
soramimi 0:bd865e5a3df3 68 }
soramimi 0:bd865e5a3df3 69
soramimi 0:bd865e5a3df3 70 void i2c_repeat()
soramimi 0:bd865e5a3df3 71 {
soramimi 0:bd865e5a3df3 72 i2c_cl_1();
soramimi 0:bd865e5a3df3 73 wait10us();
soramimi 0:bd865e5a3df3 74 i2c_da_0();
soramimi 0:bd865e5a3df3 75 wait10us();
soramimi 0:bd865e5a3df3 76 i2c_cl_0();
soramimi 0:bd865e5a3df3 77 wait10us();
soramimi 0:bd865e5a3df3 78 }
soramimi 0:bd865e5a3df3 79
soramimi 0:bd865e5a3df3 80 bool i2c_write(int c)
soramimi 0:bd865e5a3df3 81 {
soramimi 0:bd865e5a3df3 82 int i;
soramimi 0:bd865e5a3df3 83 bool nack;
soramimi 0:bd865e5a3df3 84
soramimi 0:bd865e5a3df3 85 wait10us();
soramimi 0:bd865e5a3df3 86
soramimi 0:bd865e5a3df3 87 for (i = 0; i < 8; i++) {
soramimi 0:bd865e5a3df3 88 if (c & 0x80) {
soramimi 0:bd865e5a3df3 89 i2c_da_1();
soramimi 0:bd865e5a3df3 90 } else {
soramimi 0:bd865e5a3df3 91 i2c_da_0();
soramimi 0:bd865e5a3df3 92 }
soramimi 0:bd865e5a3df3 93 c <<= 1;
soramimi 0:bd865e5a3df3 94 wait10us();
soramimi 0:bd865e5a3df3 95 i2c_cl_1();
soramimi 0:bd865e5a3df3 96 wait10us();
soramimi 0:bd865e5a3df3 97 i2c_cl_0();
soramimi 0:bd865e5a3df3 98 wait10us();
soramimi 0:bd865e5a3df3 99 }
soramimi 0:bd865e5a3df3 100
soramimi 0:bd865e5a3df3 101 i2c_da_1();
soramimi 0:bd865e5a3df3 102 wait10us();
soramimi 0:bd865e5a3df3 103
soramimi 0:bd865e5a3df3 104 i2c_cl_1();
soramimi 0:bd865e5a3df3 105 wait10us();
soramimi 0:bd865e5a3df3 106 nack = i2c_get_da();
soramimi 0:bd865e5a3df3 107 i2c_cl_0();
soramimi 0:bd865e5a3df3 108
soramimi 0:bd865e5a3df3 109 return nack;
soramimi 0:bd865e5a3df3 110 }
soramimi 0:bd865e5a3df3 111
soramimi 0:bd865e5a3df3 112 int i2c_read(bool nack)
soramimi 0:bd865e5a3df3 113 {
soramimi 0:bd865e5a3df3 114 int i, c;
soramimi 0:bd865e5a3df3 115
soramimi 0:bd865e5a3df3 116 i2c_da_1();
soramimi 0:bd865e5a3df3 117 wait10us();
soramimi 0:bd865e5a3df3 118
soramimi 0:bd865e5a3df3 119 c = 0;
soramimi 0:bd865e5a3df3 120
soramimi 0:bd865e5a3df3 121 for (i = 0; i < 8; i++) {
soramimi 0:bd865e5a3df3 122 i2c_cl_1();
soramimi 0:bd865e5a3df3 123 wait10us();
soramimi 0:bd865e5a3df3 124 c <<= 1;
soramimi 0:bd865e5a3df3 125 if (i2c_get_da()) {
soramimi 0:bd865e5a3df3 126 c |= 1;
soramimi 0:bd865e5a3df3 127 }
soramimi 0:bd865e5a3df3 128 i2c_cl_0();
soramimi 0:bd865e5a3df3 129 wait10us();
soramimi 0:bd865e5a3df3 130 }
soramimi 0:bd865e5a3df3 131
soramimi 0:bd865e5a3df3 132 if (nack) {
soramimi 0:bd865e5a3df3 133 i2c_da_1();
soramimi 0:bd865e5a3df3 134 } else {
soramimi 0:bd865e5a3df3 135 i2c_da_0();
soramimi 0:bd865e5a3df3 136 }
soramimi 0:bd865e5a3df3 137 wait10us();
soramimi 0:bd865e5a3df3 138 i2c_cl_1();
soramimi 0:bd865e5a3df3 139 wait10us();
soramimi 0:bd865e5a3df3 140 i2c_cl_0();
soramimi 0:bd865e5a3df3 141 wait10us();
soramimi 0:bd865e5a3df3 142
soramimi 0:bd865e5a3df3 143 return c;
soramimi 0:bd865e5a3df3 144 }
soramimi 0:bd865e5a3df3 145
soramimi 0:bd865e5a3df3 146 #endif
soramimi 0:bd865e5a3df3 147
soramimi 0:bd865e5a3df3 148
soramimi 0:bd865e5a3df3 149 // ns9542
soramimi 0:bd865e5a3df3 150
soramimi 0:bd865e5a3df3 151 void ns9542_write(int a, int c)
soramimi 0:bd865e5a3df3 152 {
soramimi 0:bd865e5a3df3 153 #if 01
soramimi 0:bd865e5a3df3 154 i2c_start();
soramimi 0:bd865e5a3df3 155 i2c_write(0xc8);
soramimi 0:bd865e5a3df3 156 i2c_write(a);
soramimi 0:bd865e5a3df3 157 i2c_write(c);
soramimi 0:bd865e5a3df3 158 i2c_stop();
soramimi 0:bd865e5a3df3 159 #else
soramimi 0:bd865e5a3df3 160 char tmp[2];
soramimi 0:bd865e5a3df3 161 i2c.start();
soramimi 0:bd865e5a3df3 162 tmp[0] = a;
soramimi 0:bd865e5a3df3 163 tmp[1] = c;
soramimi 0:bd865e5a3df3 164 i2c.write(0xc8, tmp, 2);
soramimi 0:bd865e5a3df3 165 i2c.stop();
soramimi 0:bd865e5a3df3 166 #endif
soramimi 0:bd865e5a3df3 167 }
soramimi 0:bd865e5a3df3 168
soramimi 0:bd865e5a3df3 169 int ns9542_read(int a)
soramimi 0:bd865e5a3df3 170 {
soramimi 0:bd865e5a3df3 171 #if 01
soramimi 0:bd865e5a3df3 172 int c;
soramimi 0:bd865e5a3df3 173 i2c_start();
soramimi 0:bd865e5a3df3 174 i2c_write(0xc8);
soramimi 0:bd865e5a3df3 175 i2c_write(a);
soramimi 0:bd865e5a3df3 176 i2c_repeat();
soramimi 0:bd865e5a3df3 177 i2c_write(0xc9);
soramimi 0:bd865e5a3df3 178 c = i2c_read(true);
soramimi 0:bd865e5a3df3 179 i2c_stop();
soramimi 0:bd865e5a3df3 180 return c;
soramimi 0:bd865e5a3df3 181 #else
soramimi 0:bd865e5a3df3 182 char tmp[2];
soramimi 0:bd865e5a3df3 183 i2c.start();
soramimi 0:bd865e5a3df3 184 tmp[0] = a;
soramimi 0:bd865e5a3df3 185 tmp[1] = 0xc9;
soramimi 0:bd865e5a3df3 186 i2c.write(0xc8, tmp, 1);
soramimi 0:bd865e5a3df3 187 i2c.write(0xc8, tmp + 1, 1, true);
soramimi 0:bd865e5a3df3 188 unsigned char c = i2c.read(1);
soramimi 0:bd865e5a3df3 189 i2c.stop();
soramimi 0:bd865e5a3df3 190 return c;
soramimi 0:bd865e5a3df3 191 #endif
soramimi 0:bd865e5a3df3 192 }
soramimi 0:bd865e5a3df3 193
soramimi 0:bd865e5a3df3 194 void ns9542_imf_adjust()
soramimi 0:bd865e5a3df3 195 {
soramimi 0:bd865e5a3df3 196 int bF, imf, fhm, g_fhm;
soramimi 0:bd865e5a3df3 197 bF = 0;
soramimi 0:bd865e5a3df3 198 g_fhm = 0xf0;
soramimi 0:bd865e5a3df3 199 ns9542_write(0x15, 0x0e);
soramimi 0:bd865e5a3df3 200 ns9542_write(0x3d, 0x27);
soramimi 0:bd865e5a3df3 201 for (fhm = 0; fhm < 4; fhm++) {
soramimi 0:bd865e5a3df3 202 bF = 0;
soramimi 0:bd865e5a3df3 203 for (imf = 0; imf < 3; imf++) {
soramimi 0:bd865e5a3df3 204 ns9542_write(0x37, fhm);
soramimi 0:bd865e5a3df3 205 ns9542_write(0x16, 22 + imf);
soramimi 0:bd865e5a3df3 206 wait10ms();
soramimi 0:bd865e5a3df3 207 if ((ns9542_read(0x70) & 0x0c) == 0x0c) {
soramimi 0:bd865e5a3df3 208 bF++;
soramimi 0:bd865e5a3df3 209 if (imf == 1 && g_fhm == 0xf0) {
soramimi 0:bd865e5a3df3 210 g_fhm = fhm;
soramimi 0:bd865e5a3df3 211 }
soramimi 0:bd865e5a3df3 212 }
soramimi 0:bd865e5a3df3 213 }
soramimi 0:bd865e5a3df3 214 if (bF == 3) {
soramimi 0:bd865e5a3df3 215 g_fhm = fhm;
soramimi 0:bd865e5a3df3 216 break;
soramimi 0:bd865e5a3df3 217 }
soramimi 0:bd865e5a3df3 218 }
soramimi 0:bd865e5a3df3 219 ns9542_write(0x37, 0x80 | g_fhm);
soramimi 0:bd865e5a3df3 220 ns9542_write(0x16, 23);
soramimi 0:bd865e5a3df3 221 ns9542_write(0x3d, 0x37);
soramimi 0:bd865e5a3df3 222 wait100ms();
soramimi 0:bd865e5a3df3 223 }
soramimi 0:bd865e5a3df3 224
soramimi 0:bd865e5a3df3 225 void ns9542_best_iml(int iml)
soramimi 0:bd865e5a3df3 226 {
soramimi 0:bd865e5a3df3 227 ns9542_write(0x32, 0x00);
soramimi 0:bd865e5a3df3 228 while (iml < 16) {
soramimi 0:bd865e5a3df3 229 ns9542_write(0x17, 0xc0 | iml);
soramimi 0:bd865e5a3df3 230 wait10ms();
soramimi 0:bd865e5a3df3 231 if (!(ns9542_read(0x70) & 0x08)) {
soramimi 0:bd865e5a3df3 232 break;
soramimi 0:bd865e5a3df3 233 }
soramimi 0:bd865e5a3df3 234 iml++;
soramimi 0:bd865e5a3df3 235 }
soramimi 0:bd865e5a3df3 236 iml--;
soramimi 0:bd865e5a3df3 237 ns9542_write(0x17, 0xc0 | iml);
soramimi 0:bd865e5a3df3 238 ns9542_write(0x32, 0x80);
soramimi 0:bd865e5a3df3 239 wait10ms();
soramimi 0:bd865e5a3df3 240 ns9542_write(0xfe, 0x0a);
soramimi 0:bd865e5a3df3 241 wait10ms();
soramimi 0:bd865e5a3df3 242 wait10ms();
soramimi 0:bd865e5a3df3 243 }
soramimi 0:bd865e5a3df3 244
soramimi 0:bd865e5a3df3 245 void ns9542_find_pg(int ialgn, int *fine_phase, int *fine_gain, int *result_pg)
soramimi 0:bd865e5a3df3 246 {
soramimi 0:bd865e5a3df3 247 int i, j;
soramimi 0:bd865e5a3df3 248 for (i = 0; i < 16; i++) {
soramimi 0:bd865e5a3df3 249 ns9542_write(0x15, 0x0a | (ialgn << 4));
soramimi 0:bd865e5a3df3 250 ns9542_write(0x15, 0x0b | (ialgn << 4));
soramimi 0:bd865e5a3df3 251 if (ns9542_read(0x05) & 0x08) {
soramimi 0:bd865e5a3df3 252 for (j = 0; j < 20; j++) {
soramimi 0:bd865e5a3df3 253 if (!(ns9542_read(0x05) & 0x08)) {
soramimi 0:bd865e5a3df3 254 int g = ns9542_read(0x65);
soramimi 0:bd865e5a3df3 255 int p = ns9542_read(0x66);
soramimi 0:bd865e5a3df3 256 if (g >= 103 && g <= 138 && 2 >= p && p <= 14) {
soramimi 0:bd865e5a3df3 257 *fine_gain = g;
soramimi 0:bd865e5a3df3 258 *fine_phase = p;
soramimi 0:bd865e5a3df3 259 *result_pg = 1;
soramimi 0:bd865e5a3df3 260 return;
soramimi 0:bd865e5a3df3 261 }
soramimi 0:bd865e5a3df3 262 }
soramimi 0:bd865e5a3df3 263 wait10ms();
soramimi 0:bd865e5a3df3 264 }
soramimi 0:bd865e5a3df3 265 }
soramimi 0:bd865e5a3df3 266 }
soramimi 0:bd865e5a3df3 267 *result_pg = 0;
soramimi 0:bd865e5a3df3 268 }
soramimi 0:bd865e5a3df3 269
soramimi 0:bd865e5a3df3 270 void ns9542_table_write(int *fine_p, int *fine_g)
soramimi 0:bd865e5a3df3 271 {
soramimi 0:bd865e5a3df3 272 int i, j, k, result;
soramimi 0:bd865e5a3df3 273 result = 0;
soramimi 0:bd865e5a3df3 274 for (i = 0; i < 4; i++) {
soramimi 0:bd865e5a3df3 275 ns9542_write(0x38, fine_g[i]);
soramimi 0:bd865e5a3df3 276 ns9542_write(0x39, fine_p[i] << 4);
soramimi 0:bd865e5a3df3 277 for (j = 0; j < 10; j++) {
soramimi 0:bd865e5a3df3 278 ns9542_write(0x15, 0x0e | (i << 4));
soramimi 0:bd865e5a3df3 279 ns9542_write(0x15, 0x03 | (i << 4));
soramimi 0:bd865e5a3df3 280 if (ns9542_read(0x05) & 0x08) {
soramimi 0:bd865e5a3df3 281 wait100ms();
soramimi 0:bd865e5a3df3 282 for (k = 0; k < 10; k++) {
soramimi 0:bd865e5a3df3 283 if (!(ns9542_read(0x05) & 0x08)) {
soramimi 0:bd865e5a3df3 284 result++;
soramimi 0:bd865e5a3df3 285 goto L1;
soramimi 0:bd865e5a3df3 286 }
soramimi 0:bd865e5a3df3 287 wait10ms();
soramimi 0:bd865e5a3df3 288 }
soramimi 0:bd865e5a3df3 289 break;
soramimi 0:bd865e5a3df3 290 }
soramimi 0:bd865e5a3df3 291 }
soramimi 0:bd865e5a3df3 292 L1:;
soramimi 0:bd865e5a3df3 293 if (result != i + 1) {
soramimi 0:bd865e5a3df3 294 break;
soramimi 0:bd865e5a3df3 295 }
soramimi 0:bd865e5a3df3 296 }
soramimi 0:bd865e5a3df3 297 }
soramimi 0:bd865e5a3df3 298
soramimi 0:bd865e5a3df3 299 void ns9542_dsp_align_body()
soramimi 0:bd865e5a3df3 300 {
soramimi 0:bd865e5a3df3 301 int iml, imf, ialgn, cnt, fp, fg;
soramimi 0:bd865e5a3df3 302 int fine_p[5] = { 0, 0, 0, 0, 0 };
soramimi 0:bd865e5a3df3 303 int fine_g[5] = { 0, 0, 0, 0, 0 };
soramimi 0:bd865e5a3df3 304 iml = 5;
soramimi 0:bd865e5a3df3 305 for (ialgn = 0; ialgn < 4; ialgn++) {
soramimi 0:bd865e5a3df3 306 ns9542_write(0x15, 0x0a | (ialgn << 4));
soramimi 0:bd865e5a3df3 307 wait100ms();
soramimi 0:bd865e5a3df3 308 wait100ms();
soramimi 0:bd865e5a3df3 309 ns9542_best_iml(iml);
soramimi 0:bd865e5a3df3 310 imf = 0;
soramimi 0:bd865e5a3df3 311 cnt = 0;
soramimi 0:bd865e5a3df3 312 fp = 0;
soramimi 0:bd865e5a3df3 313 fg = 0;
soramimi 0:bd865e5a3df3 314 for (cnt = 0; cnt < 5; cnt++) {
soramimi 0:bd865e5a3df3 315 int fine_phase, fine_gain, result_pg;
soramimi 0:bd865e5a3df3 316 ns9542_find_pg(ialgn, &fine_phase, &fine_gain, &result_pg);
soramimi 0:bd865e5a3df3 317 if (result_pg == 0) {
soramimi 0:bd865e5a3df3 318 return;
soramimi 0:bd865e5a3df3 319 }
soramimi 0:bd865e5a3df3 320 fp = fp + fine_phase;
soramimi 0:bd865e5a3df3 321 fg = fg + fine_gain;
soramimi 0:bd865e5a3df3 322 if (cnt == 2 && ialgn < 2) {
soramimi 0:bd865e5a3df3 323 cnt++;
soramimi 0:bd865e5a3df3 324 break;
soramimi 0:bd865e5a3df3 325 }
soramimi 0:bd865e5a3df3 326 }
soramimi 0:bd865e5a3df3 327 fine_p[ialgn] = fp / cnt;
soramimi 0:bd865e5a3df3 328 fine_g[ialgn] = fg / cnt;
soramimi 0:bd865e5a3df3 329 }
soramimi 0:bd865e5a3df3 330 ns9542_table_write(fine_p, fine_g);
soramimi 0:bd865e5a3df3 331 }
soramimi 0:bd865e5a3df3 332
soramimi 0:bd865e5a3df3 333 void ns9542_mute(bool mute)
soramimi 0:bd865e5a3df3 334 {
soramimi 0:bd865e5a3df3 335 if (mute) {
soramimi 0:bd865e5a3df3 336 ns9542_write(0x00, ns9542_read(0x00) | 0x02);
soramimi 0:bd865e5a3df3 337 } else {
soramimi 0:bd865e5a3df3 338 ns9542_write(0x00, ns9542_read(0x00) & ~0x02);
soramimi 0:bd865e5a3df3 339 }
soramimi 0:bd865e5a3df3 340 }
soramimi 0:bd865e5a3df3 341
soramimi 0:bd865e5a3df3 342 void ns9542_tune_am9(int freq) // freq = kHz
soramimi 0:bd865e5a3df3 343 {
soramimi 0:bd865e5a3df3 344 unsigned short psy;
soramimi 0:bd865e5a3df3 345
soramimi 0:bd865e5a3df3 346 psy = freq;
soramimi 0:bd865e5a3df3 347
soramimi 0:bd865e5a3df3 348 ns9542_write(0x00, 0x23);
soramimi 0:bd865e5a3df3 349
soramimi 0:bd865e5a3df3 350 wait10ms();
soramimi 0:bd865e5a3df3 351 wait10ms();
soramimi 0:bd865e5a3df3 352
soramimi 0:bd865e5a3df3 353 ns9542_write(0x04, 0x80);
soramimi 0:bd865e5a3df3 354 ns9542_write(0x0c, 0xf0);
soramimi 0:bd865e5a3df3 355
soramimi 0:bd865e5a3df3 356 ns9542_write(0x10, 0x10);
soramimi 0:bd865e5a3df3 357
soramimi 0:bd865e5a3df3 358 ns9542_write(0x02, psy & 0xff);
soramimi 0:bd865e5a3df3 359 ns9542_write(0x03, psy >> 8);
soramimi 0:bd865e5a3df3 360
soramimi 0:bd865e5a3df3 361 ns9542_write(0x00, 0x21);
soramimi 0:bd865e5a3df3 362 }
soramimi 0:bd865e5a3df3 363
soramimi 0:bd865e5a3df3 364 void ns9542_tune_fm(int freq) // freq = MHz * 100
soramimi 0:bd865e5a3df3 365 {
soramimi 0:bd865e5a3df3 366 unsigned short psy;
soramimi 0:bd865e5a3df3 367
soramimi 0:bd865e5a3df3 368 psy = freq / 5;
soramimi 0:bd865e5a3df3 369
soramimi 0:bd865e5a3df3 370 ns9542_write(0x00, 0x03);
soramimi 0:bd865e5a3df3 371
soramimi 0:bd865e5a3df3 372 ns9542_write(0x10, 0x10);
soramimi 0:bd865e5a3df3 373
soramimi 0:bd865e5a3df3 374 ns9542_write(0x02, psy & 0xff);
soramimi 0:bd865e5a3df3 375 ns9542_write(0x03, psy >> 8);
soramimi 0:bd865e5a3df3 376
soramimi 0:bd865e5a3df3 377 ns9542_write(0x00, 0x01);
soramimi 0:bd865e5a3df3 378 }
soramimi 0:bd865e5a3df3 379
soramimi 0:bd865e5a3df3 380 void ns9542_reset()
soramimi 0:bd865e5a3df3 381 {
soramimi 0:bd865e5a3df3 382 ns9542_write(0xfe, 0xaa);
soramimi 0:bd865e5a3df3 383 }
soramimi 0:bd865e5a3df3 384
soramimi 0:bd865e5a3df3 385 void ns9542_power_on()
soramimi 0:bd865e5a3df3 386 {
soramimi 0:bd865e5a3df3 387 static unsigned char power_on[] = {
soramimi 0:bd865e5a3df3 388 0x01, 0x30,
soramimi 0:bd865e5a3df3 389 0x0c, 0x80,
soramimi 0:bd865e5a3df3 390 0x0e, 0x34,
soramimi 0:bd865e5a3df3 391 0x15, 0xc4,
soramimi 0:bd865e5a3df3 392 0x20, 0x3c,
soramimi 0:bd865e5a3df3 393 0x21, 0x03,
soramimi 0:bd865e5a3df3 394 0x22, 0x0a,
soramimi 0:bd865e5a3df3 395 0x23, 0x0a,
soramimi 0:bd865e5a3df3 396 0x30, 0xff,
soramimi 0:bd865e5a3df3 397 0x3d, 0x07,
soramimi 0:bd865e5a3df3 398 0x40, 0x1a,
soramimi 0:bd865e5a3df3 399 0x41, 0x9a,
soramimi 0:bd865e5a3df3 400 0x50, 0xe1,
soramimi 0:bd865e5a3df3 401 0x54, 0xb0,
soramimi 0:bd865e5a3df3 402 0x55, 0x36,
soramimi 0:bd865e5a3df3 403 0x5c, 0xc8,
soramimi 0:bd865e5a3df3 404 0x5d, 0x61,
soramimi 0:bd865e5a3df3 405 0x5e, 0x88,
soramimi 0:bd865e5a3df3 406 0x5f, 0xa5,
soramimi 0:bd865e5a3df3 407 0x71, 0x2c,
soramimi 0:bd865e5a3df3 408 0x72, 0x06,
soramimi 0:bd865e5a3df3 409 };
soramimi 0:bd865e5a3df3 410 int i;
soramimi 0:bd865e5a3df3 411 for (i = 0; i < sizeof(power_on); i += 2) {
soramimi 0:bd865e5a3df3 412 ns9542_write(power_on[i], power_on[i + 1]);
soramimi 0:bd865e5a3df3 413 }
soramimi 0:bd865e5a3df3 414
soramimi 0:bd865e5a3df3 415 ns9542_write(0x00, ns9542_read(0x00) | 0x03);
soramimi 0:bd865e5a3df3 416 }
soramimi 0:bd865e5a3df3 417
soramimi 0:bd865e5a3df3 418 void ns9542_dsp_alignment()
soramimi 0:bd865e5a3df3 419 {
soramimi 0:bd865e5a3df3 420 ns9542_write(0x0e, ns9542_read(0x0e) & ~0x60 | 0x40);
soramimi 0:bd865e5a3df3 421 ns9542_write(0x01, 0x08);
soramimi 0:bd865e5a3df3 422 ns9542_write(0x15, 0x0c);
soramimi 0:bd865e5a3df3 423 ns9542_write(0x16, 0x17);
soramimi 0:bd865e5a3df3 424 ns9542_write(0x37, 0x82);
soramimi 0:bd865e5a3df3 425 ns9542_write(0x3d, 0x37);
soramimi 0:bd865e5a3df3 426 wait100ms();
soramimi 0:bd865e5a3df3 427
soramimi 0:bd865e5a3df3 428 ns9542_imf_adjust();
soramimi 0:bd865e5a3df3 429 ns9542_dsp_align_body();
soramimi 0:bd865e5a3df3 430
soramimi 0:bd865e5a3df3 431 ns9542_write(0x01, 0x38);
soramimi 0:bd865e5a3df3 432 ns9542_write(0x0e, ns9542_read(0x0e) & ~0x60 | 0x20);
soramimi 0:bd865e5a3df3 433 ns9542_write(0x15, 0xc0);
soramimi 0:bd865e5a3df3 434 ns9542_write(0x17, 0x20);
soramimi 0:bd865e5a3df3 435 ns9542_write(0x32, 0x00);
soramimi 0:bd865e5a3df3 436 ns9542_write(0x37, 0x01);
soramimi 0:bd865e5a3df3 437 }
soramimi 0:bd865e5a3df3 438
soramimi 0:bd865e5a3df3 439 void ns9542_init()
soramimi 0:bd865e5a3df3 440 {
soramimi 0:bd865e5a3df3 441 i2c_sda.mode(PullUp);
soramimi 0:bd865e5a3df3 442 i2c_scl.mode(PullUp);
soramimi 0:bd865e5a3df3 443 i2c_sda.input();
soramimi 0:bd865e5a3df3 444 i2c_scl.input();
soramimi 0:bd865e5a3df3 445 i2c_sda.write(0);
soramimi 0:bd865e5a3df3 446 i2c_scl.write(0);
soramimi 0:bd865e5a3df3 447
soramimi 0:bd865e5a3df3 448 ns9542_reset();
soramimi 0:bd865e5a3df3 449 ns9542_power_on();
soramimi 0:bd865e5a3df3 450 ns9542_dsp_alignment();
soramimi 0:bd865e5a3df3 451 }
soramimi 0:bd865e5a3df3 452