int DIS_init() { if (!bcm2835_init()) return 1; bcm2835_gpio_fsel(DIS_CS1, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel(DIS_CS2, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel(DIS_CS3, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel(DIS_CS4, BCM2835_GPIO_FSEL_OUTP); chipSelect(DIS_NONE); bcm2835_spi_begin(); bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); bcm2835_spi_setClockDivider(DIS_CLOCK_DIVIDER); bcm2835_spi_chipSelect(BCM2835_SPI_CS_NONE); return 0; }
int main(int argc, char** argv) { /*Configuring POSC with PLL, with goal FOSC = 80 MHZ */ // Configure PLL prescaler, PLL postscaler, PLL divisor // Fin = 8 Mhz, 8 * (40/2/2) = 80 PLLFBD = 18; // M=40 // change to 38 for POSC 80 Mhz - this worked only on a single MCU for uknown reason CLKDIVbits.PLLPOST = 0; // N2=2 CLKDIVbits.PLLPRE = 0; // N1=2 // Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011) //__builtin_write_OSCCONH(0x03); // tune FRC OSCTUN = 23; // 23 * 0.375 = 8.625 % -> 7.37 Mhz * 1.08625 = 8.005Mhz // Initiate Clock Switch to external oscillator NOSC=0b011 (alternative use FRC with PLL (NOSC=0b01) __builtin_write_OSCCONH(0b011); __builtin_write_OSCCONL(OSCCON | 0x01); // Wait for Clock switch to occur while (OSCCONbits.COSC!= 0b011); // Wait for PLL to lock while (OSCCONbits.LOCK!= 1); // local variables in main function int status = 0; int i = 0; int ax = 0, ay = 0, az = 0; int statusProxi[8]; int slowLoopControl = 0; UINT16 timerVal = 0; float timeElapsed = 0.0; //extern UINT8 pwmMotor; extern UINT16 speakerAmp_ref; extern UINT16 speakerFreq_ref; extern UINT8 proxyStandby; UINT16 dummy = 0x0000; setUpPorts(); delay_t1(50); PWMInit(); delay_t1(50); ctlPeltier = 0; PeltierVoltageSet(ctlPeltier); FanCooler(0); diagLED_r[0] = 100; diagLED_r[1] = 0; diagLED_r[2] = 0; LedUser(diagLED_r[0], diagLED_r[1],diagLED_r[2]); // Speaker initialization - set to 0,1 spi1Init(2, 0); speakerAmp_ref = 0; speakerAmp_ref_old = 10; speakerFreq_ref = 1; speakerFreq_ref_old = 10; int count = 0; UINT16 inBuff[2] = {0}; UINT16 outBuff[2] = {0}; while (speakerAmp_ref != speakerAmp_ref_old) { if (count > 5 ) { // Error ! //LedUser(100, 0, 0); break; } inBuff[0] = (speakerAmp_ref & 0x0FFF) | 0x1000; chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], outBuff); chipDeselect(slaveVib); chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], &speakerAmp_ref_old); chipDeselect(slaveVib); count++; } count = 0; while (speakerFreq_ref != speakerFreq_ref_old) { if (count > 5 ) { // Error ! //LedUser(0, 100, 0); break; } inBuff[0] = (speakerFreq_ref & 0x0FFF) | 0x2000; chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], outBuff); chipDeselect(slaveVib); chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], &speakerFreq_ref_old); chipDeselect(slaveVib); count++; } accPin = aSlaveR; accPeriod = 1.0 / ACC_RATE * 1000000.0; // in us; for ACC_RATE = 3200 Hz it should equal 312.5 us status = adxl345Init(accPin); ax = status; delay_t1(5); /* Init FFT coefficients */ TwidFactorInit(LOG2_FFT_BUFF, &Twiddles_array[0],0); delta_freq = (float)ACC_RATE / FFT_BUFF; // read 100 values to calculate bias int m; int n = 0; for (m = 0; m < 100; m++) { status = readAccXYZ(accPin, &ax, &ay, &az); if (status <= 0) { // } else { ax_b_l += ax; ay_b_l += ay; az_b_l += az; n++; } delay_t1(1); } ax_b_l /= n; ay_b_l /= n; az_b_l /= n; _SI2C2IE = 0; _SI2C2IF = 0; // Proximity sensors initalization I2C1MasterInit(); status = VCNL4000Init(); // Cooler temperature sensors initalization status = adt7420Init(0, ADT74_I2C_ADD_mainBoard); delay_t1(1); muxCh = I2C1ChSelect(1, 6); status = adt7420Init(0, ADT74_I2C_ADD_flexPCB); // Temperature sensors initialization statusTemp[0] = adt7320Init(tSlaveF, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[1] = adt7320Init(tSlaveR, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[2] = adt7320Init(tSlaveB, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[3] = adt7320Init(tSlaveL, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); // Temperature estimation initialization for (i = 0; i < 50; i++) { adt7320ReadTemp(tSlaveF, &temp_f); delay_t1(1); adt7320ReadTemp(tSlaveL, &temp_l); delay_t1(1); adt7320ReadTemp(tSlaveB, &temp_b); delay_t1(1); adt7320ReadTemp(tSlaveR, &temp_r); delay_t1(1); } tempBridge[0] = temp_f; tempBridge[1] = temp_r; tempBridge[2] = temp_b; tempBridge[3] = temp_l; if (statusTemp[0] != 1) temp_f = -1; if (statusTemp[1] != 1) temp_r = -1; if (statusTemp[2] != 1) temp_b = -1; if (statusTemp[3] != 1) temp_l = -1; // CASU ring average temperature temp_casu = 0; tempNum = 0; tempSensors = 0; for (i = 0; i < 4; i++) { if (statusTemp[i] == 1 && tempBridge[i] > 20 && tempBridge[i] < 60) { tempNum++; temp_casu += tempBridge[i]; tempSensors++; } } if (tempNum > 0) temp_casu /= tempNum; else temp_casu = -1; temp_casu1 = temp_casu; temp_wax = temp_casu; temp_wax1 = temp_casu; temp_model = temp_wax; temp_old[0] = temp_f; temp_old[1] = temp_r; temp_old[2] = temp_b; temp_old[3] = temp_l; temp_old[4] = temp_flexPCB; temp_old[5] = temp_pcb; temp_old[6] = temp_casu; temp_old[7] = temp_wax; for (i = 0; i < 4; i++) { uref_m[i] = temp_wax; } // Configure i2c2 as a slave device and interrupt priority 5 I2C2SlaveInit(I2C2_CASU_ADD, BB_I2C_INT_PRIORITY); // delay for 2 sec for(i = 0; i < 4; i ++) { delay_t1(500); ClrWdt(); } while (i2cStarted == 0) { delay_t1(200); ClrWdt(); } dma0Init(); dma1Init(); CloseTimer4(); ConfigIntTimer4(T4_INT_ON | TEMP_LOOP_PRIORITY); OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(2000, 256)); CloseTimer5(); ConfigIntTimer5(T5_INT_ON | FFT_LOOP_PRIORITY); OpenTimer5(T5_ON | T5_PS_1_256, ticks_from_ms(1000, 256)); diagLED_r[0] = 0; diagLED_r[1] = 0; diagLED_r[2] = 0; LedUser(diagLED_r[0], diagLED_r[1],diagLED_r[2]); start_acc_acquisition(); while(1) { ConfigIntTimer2(T2_INT_OFF); // Disable timer interrupt IFS0bits.T2IF = 0; // Clear interrupt flag OpenTimer2(T2_ON | T2_PS_1_256, 65535); // Configure timer if (!proxyStandby) { statusProxi[0] = I2C1ChSelect(1, 2); // Front proxy_f = VCNL4000ReadProxi(); delay_t1(1); statusProxi[1] = I2C1ChSelect(1, 4); // Back right proxy_br = VCNL4000ReadProxi(); delay_t1(1); statusProxi[2] = I2C1ChSelect(1, 3); // Front right proxy_fr = VCNL4000ReadProxi(); delay_t1(1); statusProxi[3] = I2C1ChSelect(1, 5); // Back proxy_b = VCNL4000ReadProxi(); delay_t1(1); statusProxi[4] = I2C1ChSelect(1, 0); // Back left proxy_bl = VCNL4000ReadProxi(); delay_t1(1); statusProxi[5] = I2C1ChSelect(1, 1); // Front left proxy_fl = VCNL4000ReadProxi(); delay_t1(1); } else { proxy_f = 0; // Front proxy_br = 0; // Back right proxy_fr = 0; // Front right proxy_b = 0; // Back proxy_bl = 0; // Back left proxy_fl = 0; // Front left } if (timer4_flag == 1) { // every 2 seconds CloseTimer4(); ConfigIntTimer4(T4_INT_ON | TEMP_LOOP_PRIORITY); timer4_flag = 0; if (dma_spi2_started == 0) { OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(2000, 256)); skip_temp_filter++; tempLoop(); } else { OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(50, 256)); } } if (dma_spi2_done == 1) { fftLoop(); dma_spi2_done = 0; } if ((timer5_flag == 1) || (new_vibration_reference == 1)) { // every 1 seconds CloseTimer5(); ConfigIntTimer5(T5_INT_ON | FFT_LOOP_PRIORITY); OpenTimer5(T5_ON | T5_PS_1_256, ticks_from_ms(1000, 256)); timer5_flag = 0; if (new_vibration_reference == 1) { //if(1){ CloseTimer3(); dma0Stop(); dma1Stop(); spi2Init(2, 0); dma0Init(); dma1Init(); chipDeselect(aSlaveR); IFS0bits.DMA0IF = 0; delay_t1(30); // transient response } new_vibration_reference = 0; start_acc_acquisition(); } // Cooler fan control if (fanCtlOn == 1) { if (temp_pcb >= 25 && fanCooler == FAN_COOLER_OFF) fanCooler = FAN_COOLER_ON; else if (temp_pcb <= 24 && fanCooler == FAN_COOLER_ON) fanCooler = FAN_COOLER_OFF; // In case of I2C1 fail turn on the fan if ((proxy_f == 0xFFFF) && (proxy_fr == 0xFFFF) && (proxy_br == 0xFFFF) && (proxy_b == 0xFFFF) && (proxy_bl == 0xFFFF) && (proxy_fl == 0xFFFF)) fanCooler = FAN_COOLER_ON; } else if (fanCtlOn == 2) fanCooler = FAN_COOLER_ON; else fanCooler = FAN_COOLER_OFF; //TEST // temp_f = temp_model; // if (temp_ref < 30) { // temp_r = smc_parameters[0] * 10; // } // else { // temp_r = smc_parameters[0] / 2.0 * 10.0; // } // temp_r = alpha*10; // temp_b = sigma_m * 10; // temp_l = sigma * 10; //temp_flexPCB = temp_ref_ramp; /* proxy_f = dma_spi2_started; proxy_fl = dma_spi2_done; proxy_bl = new_vibration_reference; proxy_b = timer5_flag; proxy_br = timer4_flag; */ int dummy_filt = 0; for (i = 0; i < 8; i++) { if (index_filter[i] > 0){ dummy_filt++; } } if (dummy_filt > 0) { filtered_glitch = dummy_filt; //for (i = 0; i< 8; index_filter[i++] = 0); } else { filtered_glitch = 0; } updateMeasurements(); timerVal = ReadTimer2(); CloseTimer2(); timeElapsed = ms_from_ticks(timerVal, 256); //if (timeElapsed < MAIN_LOOP_DUR) // delay_t1(MAIN_LOOP_DUR - timeElapsed); ClrWdt(); //Clear watchdog timer } // end while(1) return (EXIT_SUCCESS); }
// // Fix a compile error - see http://stackoverflow.com/questions/920500/what-is-the-purpose-of-cxa-pure-virtual for details. // // extern "C" void __cxa_pure_virtual() { while (1); } // // The main entry point // int main(void) { // // Board and port initialisations // StellarisLaunchpad pad; StellarisPort port1(SYSCTL_PERIPH_GPIOD); StellarisPort port2(SYSCTL_PERIPH_GPIOE); // // Create a set of objects representing the output pins // StellarisPortPin clock(GPIO_PORTD_BASE, GPIO_PIN_1); StellarisPortPin shift(GPIO_PORTD_BASE, GPIO_PIN_2); StellarisPortPin chipSelect(GPIO_PORTD_BASE, GPIO_PIN_3); StellarisPortPin a(GPIO_PORTE_BASE, GPIO_PIN_1); StellarisPortPin b(GPIO_PORTE_BASE, GPIO_PIN_2); StellarisPortPin c(GPIO_PORTE_BASE, GPIO_PIN_3); // // Create and initialise the LedArrayDriver // LedArrayDriver led(&clock, &chipSelect, &shift, &a,&b,&c, NBR_OF_DISPLAY_ROWS, NBR_OF_DISPLAY_COLUMNS); led.init(); AsciiMessage welcome("**** Welcome to the Museum of Computing - open Fridays 10am to 4pm and Saturdays 9:30am to 5pm ****"); AsciiMessage exhib1("**** Visit our \"Gaming on the Go\" exhibition - 35 years of handheld games consoles ****"); AsciiMessage retroGaming("**** Join our computer games sessions on Saturdays for some retro gaming ****"); AsciiMessage website("**** See us on the web at http://www.museum-of-computing.org.uk/ ****"); AsciiMessage hackspace("**** Join the Swindon Hackspace at the Museum of Computing - Wednesdays 6:30pm to 10pm ****"); AsciiMessage compClub("**** Ask about our Kids Computer Club on Saturdays ****"); AsciiMessage schoolVisit("**** Arrange a school visit and take part in a tour of the museum, quizzes and mini projects ****"); AsciiMessage shop("**** Our shop has a range of gifts and souvenirs ****"); RepeatedGraphic multiInvader(invader, 10, 8); AnimatedGraphic pacman(animPacman, 17, 7);// columns * frames AnimatedGraphic invader(animInvader, 11, 4);// columns * frames LeftScroller scrollLeft1(led, invader, 2, displayBuffer); LeftScroller scrollLeft2(led, welcome, 1, displayBuffer); LeftScroller scrollLeft3(led, exhib1, 1, displayBuffer); LeftScroller scrollLeft4(led, multiInvader, 1, displayBuffer); LeftScroller scrollLeft5(led, retroGaming, 1, displayBuffer); LeftScroller scrollLeft6(led, pacman, 1, displayBuffer); LeftScroller scrollLeft7(led, compClub, 1, displayBuffer); LeftScroller scrollLeft8(led, schoolVisit, 1, displayBuffer); LeftScroller scrollLeft9(led, website, 1, displayBuffer); LeftScroller scrollLeft10(led, shop, 1, displayBuffer); LeftScroller scrollLeft11(led, hackspace, 1, displayBuffer); do { scrollLeft1.init(); while(scrollLeft1.animate()); scrollLeft2.init(); while(scrollLeft2.animate()); scrollLeft3.init(); while(scrollLeft3.animate()); scrollLeft4.init(); while(scrollLeft4.animate()); scrollLeft5.init(); while(scrollLeft5.animate()); scrollLeft6.init(); while(scrollLeft6.animate()); scrollLeft7.init(); while(scrollLeft7.animate()); scrollLeft8.init(); while(scrollLeft8.animate()); scrollLeft9.init(); while(scrollLeft9.animate()); scrollLeft10.init(); while(scrollLeft10.animate()); scrollLeft11.init(); while(scrollLeft11.animate()); } while(1); }
int get(uint8_t DIS_num, uint8_t cmd) { uint8_t curr_total_att = ATT_TOTAL; uint8_t curr_a5_att = ATT_A5; uint8_t curr_got_a5_att = ATT_GOT_A5; char read_tmp_buf[7]; char dummy_byte = 0x55; char tmp = 0x55; uint8_t success = 0; // Стандартный стартовый байт write_packet.write_pos.start_byte = 0xAA; // Запишем команду write_packet.write_pos.cmd_number = cmd; // Данные - нули for (uint8_t i = 0; i < 4; i++) { write_packet.write_pos.data[i] = 0x00; } // Считаем CRC write_packet.write_pos.crc = Crc8(write_packet.write_frame, 6); // Начинаем пробовать получить 0хА5 while (curr_total_att) { curr_total_att--; // printf("Chip select... \n"); chipSelect(DIS_num); // printf("Done Chip select... \n"); bcm2835_spi_transfernb((char*) write_packet.write_frame, read_tmp_buf, 7); // printf("Transferred cmd... \n"); // ждем получения 0хА5 while (curr_a5_att) { curr_a5_att--; bcm2835_spi_transfernb(&dummy_byte, &tmp, 1); bcm2835_delay(1); // если получили, то перестаем ждать if (0xA5 == tmp) { break; } } // если был получен А5 if (tmp == 0xA5) { // printf("Got 0xA5 \n"); // ждем пока пройдут все A5 while (((tmp == 0xA5) || (tmp == 0x55)) && curr_got_a5_att) { curr_got_a5_att--; bcm2835_spi_transfernb(&dummy_byte, &tmp, 1); } // получаем сами данные if (curr_got_a5_att) { // printf("Got data \n"); bcm2835_spi_transfernb(&dummy_byte, (char*) read_packet.read_frame, 5); success = 1; chipSelect(DIS_NONE); break; } curr_got_a5_att = ATT_GOT_A5; } else { curr_a5_att = ATT_A5; } chipSelect(DIS_NONE); } if (success == 1) { // скопируем в буфер данные for(uint8_t i = 0; i < 4; i++){ usr_data_buf_ptr[i] = read_packet.read_pos.data[i]; read_packet.read_pos.data[i] = 0; } return 0; } else { printf("Failed to get \n"); return 1; } }
void Spi::deSelect() { waitData(); chipSelect(-1); }