void set_avr_mapper(uint8_t val) { SPI_SS_HIGH(); FPGA_SS_LOW(); spiTransferByte(0x30 | (val & 0x0f)); FPGA_SS_HIGH(); SPI_SS_LOW(); }
void set_avr_bank(uint8_t val) { SPI_SS_HIGH(); FPGA_SS_LOW(); spiTransferByte(0x00); // SET ADDRESS spiTransferByte(val * 0x20); // select chip spiTransferByte(0x00); // select chip spiTransferByte(0x00); // select chip FPGA_SS_HIGH(); SPI_SS_LOW(); }
/** * sendCommand - send a command to the SD card * @command : command to be sent * @parameter: parameter to be sent * @deselect : Flags if the card should be deselected afterwards * * This function calculates the correct CRC7 for the command and * parameter and transmits all of it to the SD card. If requested * the card will be deselected afterwards. */ int mmc::sendCommand(const byte command, const uint32_t parameter, const byte deselect) { union { unsigned long l; unsigned char c[4]; } long2char; byte i,crc,errorcount; uint16_t counter; long2char.l = parameter; crc = crc7update(0 , 0x40+command); crc = crc7update(crc, long2char.c[3]); crc = crc7update(crc, long2char.c[2]); crc = crc7update(crc, long2char.c[1]); crc = crc7update(crc, long2char.c[0]); crc = (crc << 1) | 1; errorcount = 0; while (errorcount < CONFIG_SD_AUTO_RETRIES) { // Select card SPI_SS_LOW(); // Transfer command spiTransferByte(0x40+command); spiTransferLong(parameter); spiTransferByte(crc); // Wait for a valid response counter = 0; do { i = spiTransferByte(0xff); counter++; } while (i & 0x80 && counter < 0x1000); // Check for CRC error // can't reliably retry unless deselect is allowed if (deselect && (i & STATUS_CRC_ERROR)) { // uart_putc('x'); deselectCard(); errorcount++; continue; } if (deselect) deselectCard(); break; } return i; }
void sonar::get_data_spi(byte* left, byte* right) { SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); // SPI ON SPI_SS_LOW(); // CS to low IRQ_DELAY; *left = spi_read(); IRQ_DELAY; *right = spi_read(); SPI_SS_HIGH(); // CS to high SPCR = 0; //SPI OFF }
/** * @brief configuration of all spi related things^^ * @param 0,1 or 2 * @retval angle */ uint16_t read_spi(uint8_t selected_spi) { /* variables */ uint8_t SPI_MASTER_Buffer_Rx[RxBufferSize]; static uint16_t SPI_SELECT[]={SPI_MASTER_PIN_SS_3, SPI_MASTER_PIN_SS_2, SPI_MASTER_PIN_SS_1}; static uint8_t RxIdx = 0; static uint16_t sensor_angle; static uint16_t sensor_angle_invert; static uint16_t angle_to_send; /* prepare gpio_init structure for mode changes ----------------------------*/ static GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = SPI_MASTER_PIN_MOSI; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* CHIP SELECT ON*/ SPI_SS_LOW(selected_spi); Delay(1); /* send data request */ SPI_I2S_SendData(SPI_MASTER, 0xAA); /* wait till data was sent */ while(SPI_I2S_GetFlagStatus(SPI_MASTER, SPI_I2S_FLAG_TXE)==RESET); while(SPI_I2S_GetFlagStatus(SPI_MASTER, SPI_I2S_FLAG_BSY)==SET); /* change from transmit to receive mode */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(SPI_MASTER_GPIO, &GPIO_InitStructure); SPI_Cmd(SPI_MASTER, DISABLE); Delay(2); SPI_BiDirectionalLineConfig(SPI_MASTER, SPI_Direction_Rx); Delay(3); /* receive data: 10 bytes*/ RxIdx=0; while(RxIdx<RxBufferSize) { SPI_Cmd(SPI_MASTER, ENABLE); Delay(5); SPI_Cmd(SPI_MASTER, DISABLE); while(SPI_I2S_GetFlagStatus(SPI_MASTER, SPI_I2S_FLAG_RXNE)!=RESET) SPI_MASTER_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI_MASTER); Delay(5); } /* back to transmit mode */ SPI_BiDirectionalLineConfig(SPI_MASTER, SPI_Direction_Tx); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(SPI_MASTER_GPIO, &GPIO_InitStructure); SPI_Cmd(SPI_MASTER, ENABLE); Delay(5); /* CHIP SELECT OFF */ SPI_SS_HIGH(selected_spi); /* data interpretation */ sensor_angle = (SPI_MASTER_Buffer_Rx[2] << 8) + SPI_MASTER_Buffer_Rx[3]; sensor_angle_invert = (SPI_MASTER_Buffer_Rx[4] << 8) + SPI_MASTER_Buffer_Rx[5]; if(!(sensor_angle & 1) || sensor_angle == 0xFFFF || (sensor_angle & sensor_angle_invert) || (sensor_angle | sensor_angle_invert) != 0xFFFF) { angle_to_send = 0xabcd; } else { angle_to_send = sensor_angle; } Delay(50); return angle_to_send; }
/******************************************************************************* Set: 硬件控制设备设置 *******************************************************************************/ u32 Set(u8 Object, u32 Value) { switch (Object){ case CH_A_OFFSET: if(Value < 65536){ TIM5_ARR = 470; TIM5_CCR1 = 450 - Value; // Value = 0~200 } else { TIM5_ARR = Value >>16; TIM5_CCR1 = Value & 0xFFFF; } break; case CH_B_OFFSET: if(Value < 65536){ TIM5_ARR = 470; TIM5_CCR2 = 450 - Value; // Value = 0~200 } else { TIM5_ARR = Value >>16; TIM5_CCR2 = Value & 0xFFFF; } break; case BACKLIGHT: TIM8_CCR1 = Value; // Value = 0~100 break; case BEEP_VOLUME: TIM8_CCR2 = 100 - Value/2; // Value = 0~50 break; case BETTERY_DT: ADC3_CR2 |= (Value & 1)<<22; // Value = 1/0 ADC3_CR2 |=0x00400000; break; case ADC_MODE: if(Value == SEPARATE) FIFO_MODE_LOW(); else FIFO_MODE_HIGH(); break; case FIFO_CLR: if(Value == W_PTR){FIFO_CLRW_HIGH(); FIFO_CLRW_LOW();} if(Value == R_PTR){FIFO_CLRR_HIGH(); FIFO_CLRR_LOW();} break; case T_BASE_PSC: TIM1_PSC = Value; break; case T_BASE_ARR: if(Value==0) {TIM1_CCER=0; RCC_CFGR=0x041D8402;} // MCO as SYSCLK else if(Value==1) {TIM1_CCER=0; RCC_CFGR=0x071D8402;} // MCO as SYSCLK/2 else {RCC_CFGR=0x001D8402; TIM1_CCER=0x0003; // MCO as OC1 TIM1_ARR=Value; TIM1_CCR1=(Value+1)/2;} break; case CH_A_COUPLE: if(Value == AC ) AC_1(); else DC_1(); break; case CH_B_COUPLE: if(Value == AC ) AC_2(); else DC_2(); break; case CH_A_RANGE: switch (Value){ case _50MV: Ax0_ON(); Ax1_ON(); Ax2_HIGH(); Ax5_HIGH(); break; case _100MV: Ax0_ON(); Ax1_ON(); Ax2_LOW(); Ax5_HIGH(); break; case _200MV: Ax0_ON(); Ax1_ON(); Ax2_HIGH(); Ax5_LOW(); break; case _500MV: Ax0_ON(); Ax1_ON(); Ax2_LOW(); Ax5_LOW(); break; case _1V: Ax0_OFF(); Ax1_OFF(); Ax2_HIGH(); Ax5_HIGH(); break; case _2V: Ax0_OFF(); Ax1_OFF(); Ax2_LOW(); Ax5_HIGH(); break; case _5V: Ax0_OFF(); Ax1_OFF(); Ax2_HIGH(); Ax5_LOW(); break; case _10V: Ax0_OFF(); Ax1_OFF(); Ax2_LOW(); Ax5_LOW(); break; case CH_B: Ax0_ON(); Ax1_OFF(); Ax2_LOW(); Ax5_LOW(); break; } break; case CH_B_RANGE: switch (Value){ case _50MV: Bx0_ON(); Bx1_ON(); Bx2_HIGH(); Bx5_HIGH(); break; case _100MV: Bx0_ON(); Bx1_ON(); Bx2_LOW(); Bx5_HIGH(); break; case _200MV: Bx0_ON(); Bx1_ON(); Bx2_HIGH(); Bx5_LOW(); break; case _500MV: Bx0_ON(); Bx1_ON(); Bx2_LOW(); Bx5_LOW(); break; case _1V: Bx0_OFF(); Bx1_OFF(); Bx2_HIGH(); Bx5_HIGH(); break; case _2V: Bx0_OFF(); Bx1_OFF(); Bx2_LOW(); Bx5_HIGH(); break; case _5V: Bx0_OFF(); Bx1_OFF(); Bx2_HIGH(); Bx5_LOW(); break; case _10V: Bx0_OFF(); Bx1_OFF(); Bx2_LOW(); Bx5_LOW(); break; case CH_A: Bx0_ON(); Bx1_OFF(); Bx2_LOW(); Bx5_LOW(); break; } break; case ANALOG_ARR: GPIOB_CRL = 0x34BBB438; TIM4_CR1 = 0x0080; // SQR_OUT = Disnable GPIOA_CRL = 0x111011BB; DAC_CR = 0x0001; // DAC = Ensable TIM7_ARR = Value; TIM7_CR1 = 0x0085; break;// DAC_CLK = Enable case ANALOG_PTR: DMA2_CMAR4 = Value; break; case ANALOG_CNT: DMA2_CNDTR4 = Value; // Fout = (Cnt*(ARR+1)/72)KHz break; case DIGTAL_PSC: TIM4_PSC = Value; GPIOA_CRL |= 0x40000; // DAC_OUT = Disnable TIM7_CR1 = 0x0084; DAC_CR = 0; break; // DAC = Disnable case DIGTAL_ARR: TIM4_ARR = Value; break; case DIGTAL_CCR: GPIOB_CRL &= 0xF0FFFFFF; GPIOB_CRL |= 0x0B000000; // PORT_SQR = Enable TIM4_CCR1 = Value; TIM4_CR1 = 0x0081; break; // SQR_OUT = Enable case KEY_IF_RST: TIM3_SR = 0; //Clear TIM3 interrupt flag break; case STANDBY: if(Value == 1) { STB_EN();} else { STB_DN();} break; case FPGA_RST: GPIOB_CRH &= 0xF0FFFFFF; GPIOB_CRH |= 0x01000000; // 设PB14为输出状态 SPI_CRST_LOW(); Delayms(1); // SPI_CRST_LOW 1mS SPI_SS_HIGH(); Delayms(1); // SPI_SS_HIGH 1mS SPI_SS_LOW(); Delayms(1); // SPI_SS_LOW 1mS SPI_CRST_HIGH(); Delayms(2); // SPI_CRST_HIGH 2mS GPIOB_CRH &= 0xF0FFFFFF; GPIOB_CRH |= 0x08000000; break; // 设PB14为输入状态 case TRIGG_MODE: Set_Param(Object, Value); break; case V_THRESHOLD: Set_Param(Object, Value); break; case T_THRESHOLD: Set_Param(Object, Value & 0xFF); Set_Param(Object +1, Value >> 8); break; case ADC_CTRL: Set_Param(Object, Value); break; case A_POSITION: Set_Param(Object, Value); break; case B_POSITION: Set_Param(Object, Value); break; case REG_ADDR: Set_Param(Object, Value); break; } return 0; }