/* * ADC end conversion callback. * The PWM channels are reprogrammed using the latest ADC samples. * The latest samples are transmitted into a single SPI transaction. */ void adccb(ADCDriver *adcp, adcsample_t *buffer, size_t n) { (void) buffer; (void) n; /* Note, only in the ADC_COMPLETE state because the ADC driver fires an intermediate callback when the buffer is half full.*/ if (adcp->state == ADC_COMPLETE) { adcsample_t avg_ch1, avg_ch2; /* Calculates the average values from the ADC samples.*/ avg_ch1 = (samples[0] + samples[2] + samples[4] + samples[6]) / 4; avg_ch2 = (samples[1] + samples[3] + samples[5] + samples[7]) / 4; chSysLockFromIsr(); /* Changes the channels pulse width, the change will be effective starting from the next cycle.*/ pwmEnableChannelI(&PWMD4, 0, PWM_FRACTION_TO_WIDTH(&PWMD4, 4096, avg_ch1)); pwmEnableChannelI(&PWMD4, 3, PWM_FRACTION_TO_WIDTH(&PWMD4, 4096, avg_ch2)); /* SPI slave selection and transmission start.*/ spiSelectI(&SPID2); spiStartSendI(&SPID2, ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH, samples); chSysUnlockFromIsr(); } }
/** * @brief Sends data over the SPI bus. * @details This asynchronous function starts a transmit operation. * @pre A slave must have been selected using @p spiSelect() or * @p spiSelectI(). * @post At the end of the operation the configured callback is invoked. * @note The buffers are organized as uint8_t arrays for data sizes below * or equal to 8 bits else it is organized as uint16_t arrays. * * @param[in] spip pointer to the @p SPIDriver object * @param[in] n number of words to send * @param[in] txbuf the pointer to the transmit buffer * * @api */ void spiStartSend(SPIDriver *spip, size_t n, const void *txbuf) { osalDbgCheck((spip != NULL) && (n > 0U) && (txbuf != NULL)); osalSysLock(); osalDbgAssert(spip->state == SPI_READY, "not ready"); spiStartSendI(spip, n, txbuf); osalSysUnlock(); }
/** * @brief Sends data over the SPI bus. * @details This asynchronous function starts a transmit operation. * @pre A slave must have been selected using @p spiSelect() or * @p spiSelectI(). * @post At the end of the operation the configured callback is invoked. * @note The buffers are organized as uint8_t arrays for data sizes below * or equal to 8 bits else it is organized as uint16_t arrays. * * @param[in] spip pointer to the @p SPIDriver object * @param[in] n number of words to send * @param[in] txbuf the pointer to the transmit buffer * * @api */ void spiStartSend(SPIDriver *spip, size_t n, const void *txbuf) { chDbgCheck((spip != NULL) && (n > 0) && (txbuf != NULL), "spiStartSend"); chSysLock(); chDbgAssert(spip->state == SPI_READY, "spiStartSend(), #1", "not ready"); spiStartSendI(spip, n, txbuf); chSysUnlock(); }
/** * @brief Sends data over the SPI bus. * @details This synchronous function performs a transmit operation. * @pre In order to use this function the option @p SPI_USE_WAIT must be * enabled. * @pre In order to use this function the driver must have been configured * without callbacks (@p end_cb = @p NULL). * @note The buffers are organized as uint8_t arrays for data sizes below * or equal to 8 bits else it is organized as uint16_t arrays. * * @param[in] spip pointer to the @p SPIDriver object * @param[in] n number of words to send * @param[in] txbuf the pointer to the transmit buffer * * @api */ void spiSend(SPIDriver *spip, size_t n, const void *txbuf) { osalDbgCheck((spip != NULL) && (n > 0U) && (txbuf != NULL)); osalSysLock(); osalDbgAssert(spip->state == SPI_READY, "not ready"); osalDbgAssert(spip->config->end_cb == NULL, "has callback"); spiStartSendI(spip, n, txbuf); (void) osalThreadSuspendS(&spip->thread); osalSysUnlock(); }
/** * @brief Sends data over the SPI bus. * @details This synchronous function performs a transmit operation. * @pre In order to use this function the option @p SPI_USE_WAIT must be * enabled. * @pre In order to use this function the driver must have been configured * without callbacks (@p end_cb = @p NULL). * @note The buffers are organized as uint8_t arrays for data sizes below * or equal to 8 bits else it is organized as uint16_t arrays. * * @param[in] spip pointer to the @p SPIDriver object * @param[in] n number of words to send * @param[in] txbuf the pointer to the transmit buffer * * @api */ void spiSend(SPIDriver *spip, size_t n, const void *txbuf) { chDbgCheck((spip != NULL) && (n > 0) && (txbuf != NULL), "spiSend"); chSysLock(); chDbgAssert(spip->state == SPI_READY, "spiSend(), #1", "not ready"); chDbgAssert(spip->config->end_cb == NULL, "spiSend(), #2", "has callback"); spiStartSendI(spip, n, txbuf); _spi_wait_s(spip); chSysUnlock(); }
/** * @brief Sends data over the SPI bus. * @details This synchronous function performs a transmit operation. * @pre In order to use this function the option @p SPI_USE_WAIT must be * enabled. * @pre In order to use this function the driver must have been configured * without callbacks (@p end_cb = @p NULL). * @note The buffers are organized as uint8_t arrays for data sizes below * or equal to 8 bits else it is organized as uint16_t arrays. * * @param[in] spip pointer to the @p SPIDriver object * @param[in] n number of words to send * @param[in] txbuf the pointer to the transmit buffer * * @api */ void spiSend(SPIDriver *spip, size_t n, const void *txbuf) { osalDbgCheck((spip != NULL) && (n > 0U) && (txbuf != NULL)); #if SPI_SUPPORTS_CIRCULAR osalDbgCheck((spip->config->circular == false) || ((n & 1U) == 0U)); #endif osalSysLock(); osalDbgAssert(spip->state == SPI_READY, "not ready"); spiStartSendI(spip, n, txbuf); (void) osalThreadSuspendS(&spip->thread); osalSysUnlock(); }
//----------------------------------------------------------------------------- void kbv_drIntExtiCB(EXTDriver *extp, expchannel_t channel) { (void)extp; (void)channel; chSysLockFromISR(); memset(&async_vn_msg, 0, sizeof(async_vn_msg)); async_vn_msg.reg = VN100_REG_YPR; // ReadReg: [0x01, REG, 0x00, 0x00] async_vn_msg.buf[0] = 1; async_vn_msg.buf[1] = async_vn_msg.reg; async_vn_msg.buf_size = VN100_REG_YPR_SIZE + VN100_HEADER_SIZE; async_vn_msg.state = VN_ASYNC_1ST_SPI_CB; spiSelectI(VND1.spip); spiStartSendI(VND1.spip, 4, async_vn_msg.buf); ///**/kbed_dataReadyI(); chSysUnlockFromISR(); }