void SPIClass::begin() { if (!initialized) { void *pciDev = NULL; // Get SPI device base address pciDev = pci_Alloc(0x00, 0x10, 0x01); // PCI SPI configuration space if(pciDev == NULL) {printf("SPI device don't exist\n"); return;} SPI_IOaddr = (unsigned)(pci_In16(pciDev, 0x10) & 0xFFFFFFF0L); // get SPI base address #if defined DEBUG_MODE printf("SPI base address = %04X\n", SPI_IOaddr); #endif pci_Free(pciDev); WriteCTRR(FULLDUPEX + SPI_MODE0 + RESET); io_outpb(SPI_IOaddr + 7, FULLDUPEX); // full-dupex io_outpb(SPI_IOaddr + 7, io_inpb(SPI_IOaddr + 7) & 0xF1 | SPI_MODE0); // set mode io_outpb(SPI_IOaddr + 0x0b, 0x08); // delay clk between two transfers //SOURCE clock/(2 * SPI_CLOCK_DIV) setClockDivider(13); // 100/(2*13) ~= 4MHz useFIFO(); detachInterrupt(); io_outpb(SPI_IOaddr + 4, 0x01); // set CS = high // Set SS to high so a connected chip will be "deselected" by default pinMode(SS, OUTPUT); digitalWrite(SS, HIGH); } initialized++; // reference count }
void SPIClass::begin() { void *pciDev = NULL; // Get SPI device base address pciDev = pci_Alloc(0x00, 0x10, 0x01); // PCI SPI configuration space if(pciDev == NULL) {printf("SPI device don't exist\n"); return;} SPI_IOaddr = (unsigned)(pci_In16(pciDev, 0x10) & 0xFFFFFFF0L); // get SPI base address #if defined DEBUG_MODE printf("SPI base address = %04X\n", SPI_IOaddr); #endif pci_Free(pciDev); WriteCTRR(FULLDUPEX + SPI_MODE0 + RESET); io_outpb(SPI_IOaddr + 7, FULLDUPEX); // full-dupex io_outpb(SPI_IOaddr + 7, io_inpb(SPI_IOaddr + 7) & 0xF1 | SPI_MODE0); // set mode io_outpb(SPI_IOaddr + 0x0b, 0x08); // delay clk between two transfers //SOURCE clock/(2 * SPI_CLOCK_DIV) setClockDivider(SPI_CLOCK_DIV800); // 125k Hz useFIFO(); detachInterrupt(); io_outpb(SPI_IOaddr + 4, 0x01); // set CS = high // Set SS to high so a connected chip will be "deselected" by default digitalWrite(SS, HIGH); // When the SS pin is set as OUTPUT, it can be used as // a general purpose output port (it doesn't influence // SPI operations). //pinMode(SS, OUTPUT); // Warning: if the SS pin ever becomes a LOW INPUT then SPI // automatically switches to Slave, so the data direction of // the SS pin MUST be kept as OUTPUT. //SPCR |= _BV(MSTR); //SPCR |= _BV(SPE); // Set direction register for SCK and MOSI pin. // MISO pin automatically overrides to INPUT. // By doing this AFTER enabling SPI, we avoid accidentally // clocking in a single bit since the lines go directly // from "input" to SPI control. // http://code.google.com/p/arduino/issues/detail?id=888 //pinMode(SCK, OUTPUT); //pinMode(MOSI, OUTPUT); }