43 #include "Communication.h"
46 #define NOP asm ("nop")
52 #define EI asm ("ei");
54 #define EI __enable_interrupt();
59 #define BIT(n) (1 << (n))
61 #define CLK_SCALER (0x4)
62 #define SCALED_CLK (f_CLK / (1 << CLK_SCALER))
105 SPI_Init(
enum CSI_Bus bus,
149 SPS0 = (CLK_SCALER << 4) | CLK_SCALER;
150 }
else { SPS1 = (CLK_SCALER << 4) | CLK_SCALER;
154 case CSI00: SMR00 = 0x0020;
156 case CSI01: SMR01 = 0x0020;
158 case CSI10: SMR02 = 0x0020;
160 case CSI11: SMR03 = 0x0020;
162 case CSI20: SMR10 = 0x0020;
164 case CSI21: SMR11 = 0x0020;
166 case CSI30: SMR12 = 0x0020;
168 case CSI31: SMR13 = 0x0020;
172 clockPol = 1 - clockPol;
173 scr = (clockEdg << 13) |
178 case CSI00: SCR00 = scr;
180 case CSI01: SCR01 = scr;
182 case CSI10: SCR02 = scr;
184 case CSI11: SCR03 = scr;
186 case CSI20: SCR10 = scr;
188 case CSI21: SCR11 = scr;
190 case CSI30: SCR12 = scr;
192 case CSI31: SCR13 = scr;
197 sdrValue = SCALED_CLK / (2 * clockFreq) - 1;
200 case CSI00: SDR00 = sdrValue;
202 case CSI01: SDR01 = sdrValue;
204 case CSI10: SDR02 = sdrValue;
206 case CSI11: SDR03 = sdrValue;
208 case CSI20: SDR10 = sdrValue;
210 case CSI21: SDR11 = sdrValue;
212 case CSI30: SDR12 = sdrValue;
214 case CSI31: SDR13 = sdrValue;
219 clockPol = 1 - clockPol;
222 SO0 &= ~(0x0101 << shift);
223 SO0 |= ((clockPol << 8) | clockPol) << shift;
225 SO1 &= ~(0x0101 << shift);
226 SO1 |= ((clockPol << 8) | clockPol) << shift;
231 case CSI00: SOE0 |=
BIT(0);
233 case CSI01: SOE0 |=
BIT(1);
235 case CSI10: SOE0 |=
BIT(2);
237 case CSI11: SOE0 |=
BIT(3);
239 case CSI20: SOE1 |=
BIT(0);
241 case CSI21: SOE1 |=
BIT(1);
243 case CSI30: SOE1 |=
BIT(2);
245 case CSI31: SOE1 |=
BIT(3);
339 for(delay = 0; delay < 50; delay++) {
345 case CSI00: SS0 =
BIT(0);
347 case CSI01: SS0 =
BIT(1);
349 case CSI10: SS0 =
BIT(2);
351 case CSI11: SS0 =
BIT(3);
353 case CSI20: SS1 =
BIT(0);
355 case CSI21: SS1 =
BIT(1);
357 case CSI30: SS1 =
BIT(2);
359 case CSI31: SS1 =
BIT(3);
396 SPI_Write(
enum CSI_Bus bus,
402 unsigned char read = 0;
403 unsigned short originalSCR = 0;
404 unsigned short originalSO1 = 0;
406 volatile uint8_t *sio;
407 volatile uint16_t *ssr;
411 case CSI00: sio = &SIO00;
414 case CSI01: sio = &SIO01;
417 case CSI10: sio = &SIO10;
420 case CSI11: sio = &SIO11;
423 case CSI20: sio = &SIO20;
426 case CSI21: sio = &SIO21;
429 case CSI30: sio = &SIO30;
432 case CSI31: sio = &SIO31;
437 for(byte = 0; byte < bytesNumber; byte++) {
440 while(*ssr & 0x0040) ;
449 #define sclk_low() (P0 &= ~BIT(4))
450 #define sclk_high() (P0 |= BIT(4))
451 #define mosi_low() (P0 &= ~BIT(2))
452 #define mosi_high() (P0 |= BIT(2))
453 #define read_miso() (P0bits.bit3)
456 spi_byte_exchange(
unsigned char tx)
458 unsigned char rx = 0, n = 0;
462 for(n = 0; n < 8; n++) {
495 SPI_Read(
enum CSI_Bus bus,
502 for(n = 0; n < bytesNumber; n++) {
503 data[n] = spi_byte_exchange(data[n]);
507 unsigned short originalSCR = 0;
508 unsigned short originalSO1 = 0;
510 volatile uint8_t *sio;
511 volatile uint16_t *ssr;
516 case CSI00: sio = &SIO00;
519 case CSI01: sio = &SIO01;
522 case CSI10: sio = &SIO10;
525 case CSI11: sio = &SIO11;
528 case CSI20: sio = &SIO20;
531 case CSI21: sio = &SIO21;
534 case CSI30: sio = &SIO30;
537 case CSI31: sio = &SIO31;
543 while(*ssr & 0x0020) dummy = *sio;
546 for(byte = 0; byte < bytesNumber; byte++) {
549 while(*ssr & 0x0040) ;
566 I2C_Init(
long clockFreq)
568 long fckFreq = 32000000;
569 unsigned char wlValue = 0;
570 unsigned char whValue = 0;
572 (void)IICA0_Interrupt;
584 wlValue = (
unsigned char)((0.5 * fckFreq) / clockFreq);
585 whValue = (
unsigned char)(wlValue - (fckFreq / (10 * clockFreq)));
617 I2C_Write(
char slaveAddress,
618 unsigned char *dataBuffer,
631 IICA0 = (slaveAddress << 1);
632 while(IICA0_Flag == 0) ;
635 for(byte = 0; byte < bytesNumber; byte++) {
638 while(IICA0_Flag == 0) ;
641 status = bytesNumber;
666 I2C_Read(
char slaveAddress,
667 unsigned char *dataBuffer,
680 IICA0 = (slaveAddress << 1) + 1;
681 while(IICA0_Flag == 0) ;
685 for(byte = 0; byte < bytesNumber; byte++) {
686 if(byte == (bytesNumber - 1)) {
691 while(IICA0_Flag == 0) ;
695 status = bytesNumber;