void SPIClass::begin() { // Start clock if (SPIx == SPI1) RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); else if (SPIx == SPI2) RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); else if (SPIx == SPI3) RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); pinModeAlt(SCK, GPIO_OType_PP, GPIO_PuPd_DOWN, afSCK); pinModeAlt(MISO, GPIO_OType_PP, GPIO_PuPd_DOWN, afMISO); pinModeAlt(MOSI, GPIO_OType_PP, GPIO_PuPd_DOWN, afMOSI); SPI_I2S_DeInit(SPIx); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = dataSize; if(SPI_Data_Mode_Set != true) { //Default: SPI_MODE0 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; } SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; if(SPI_Clock_Divider_Set != true) { SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; } if(SPI_Bit_Order_Set != true) { //Default: MSBFIRST SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; } SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPIx, &SPI_InitStructure); // FIXME: the state of these settings doesn't seem to make sense...but it works for now. SPI_SSOutputCmd(SPIx, ENABLE); #if defined(SERIES_STM32F30x) || defined(SERIES_STM32F37x) // Info here: http://stackoverflow.com/questions/22769920/stm32f0-spi-loopback-no-data-on-miso if (dataSize == SPI_DataSize_16b) SPI_RxFIFOThresholdConfig(SPIx, SPI_RxFIFOThreshold_HF); else SPI_RxFIFOThresholdConfig(SPIx, SPI_RxFIFOThreshold_QF); #endif SPI_Cmd(SPIx, ENABLE); SPI_Enabled = true; }
void Encoder::init(uint8_t pin1, uint8_t pin2, uint16_t maxCount) { // NEW: read from pin config. timer = PIN_MAP[pin1].timer; pinModeAlt(pin1, GPIO_OType_PP, GPIO_PuPd_UP, PIN_MAP[pin1].altFunc); pinModeAlt(pin2, GPIO_OType_PP, GPIO_PuPd_UP, PIN_MAP[pin2].altFunc); // Start timer timerInitHelper(timer, 0, maxCount); // Configure input capture TIM_ICInitTypeDef TIM_ICInitStruct; // filter is between 0x0 and 0xF, 0 for no filter, 0xF for a lot TIM_ICInitStruct.TIM_ICFilter = 0x0; TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; TIM_ICInit(TIMER_MAP[timer].TIMx, &TIM_ICInitStruct); TIM_ICInitStruct.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIMER_MAP[timer].TIMx, &TIM_ICInitStruct); TIM_EncoderInterfaceConfig(TIMER_MAP[timer].TIMx, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling); // Enable TIM_Cmd(TIMER_MAP[timer].TIMx, ENABLE); }
/* pinModeAlt * * Parameters: * - pin: int * - mode: int * Return Type: void */ mrb_value mrb_Pi_pinModeAlt(mrb_state* mrb, mrb_value self) { mrb_int native_pin; mrb_int native_mode; /* Fetch the args */ mrb_get_args(mrb, "ii", &native_pin, &native_mode); /* Invocation */ pinModeAlt(native_pin, native_mode); return mrb_nil_value(); }
void doMode (int argc, char *argv []) { int pin ; char *mode ; if (argc != 4) { fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; mode = argv [3] ; /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; else { fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; exit (1) ; } }
/* * Class: com_pi4j_wiringpi_Gpio * Method: pinModeAlt * Signature: (II)V */ JNIEXPORT void JNICALL Java_com_pi4j_wiringpi_Gpio_pinModeAlt (JNIEnv *env, jclass obj, jint pin, jint mode) { pinModeAlt(pin, mode); }
int main (void) { int fSerial = 0; FILE * filehex; char hexBuf[256]; int line = 0; wiringPiSetup(); fSerial = serialOpen("/dev/ttyAMA0",115200); if(fSerial == -1) { printf("error while opening tty\r\n"); return 1; } filehex = fopen("domodin.hex","r"); if(filehex == NULL) { printf("error while opening hex file\r\n"); return 2; } pinMode (PIN_RST, OUTPUT); pinMode (BOOTLOADER_PIN1, OUTPUT); pinMode (BOOTLOADER_PIN2, OUTPUT); // Set IO to reset the PIC and to enable its bootloader digitalWrite (BOOTLOADER_PIN2, LOW); digitalWrite (BOOTLOADER_PIN1, HIGH); // reset PIC digitalWrite (PIN_RST, HIGH); delay(10); digitalWrite(PIN_RST, LOW); // disable the bootloader mode delay(10); digitalWrite(BOOTLOADER_PIN1, LOW); serialFlush(fSerial); while(fgets(hexBuf, sizeof(hexBuf), filehex) != NULL) { // only transmit HEX file lines with proper start code (':' character) if(hexBuf[0] != ':') continue; // transmit serialPuts(fSerial, hexBuf); if(serialGetchar(fSerial) != 0x06) { printf("Error line %d !\r\n", line); break; } line++; } pinModeAlt (BOOTLOADER_PIN1, 0b100); pinModeAlt (BOOTLOADER_PIN2, 0b100); serialClose(fSerial); fclose(filehex); printf("New firmware loaded !\r\n"); return 0 ; }