/** * @brief SPI 波特率及传输控制寄存器配置 * @param[in] instance 芯片SPI端口 * @arg HW_SPI0 芯片的SPI0端口 * @arg HW_SPI1 芯片的SPI1端口 * @arg HW_SPI2 芯片的SPI2端口 * @param[in] ctar SPI通信通道选择 * @arg HW_CTAR0 0配置寄存器 * @arg HW_CTAR1 1配置寄存器 * @param[in] frameFormat SPI通信时的相位和极性的关系 * @arg kSPI_CPOL0_CPHA0 * @arg kSPI_CPOL1_CPHA0 * @arg kSPI_CPOL0_CPHA1 * @arg kSPI_CPOL1_CPHA1 * \param[in] dataSize 数据大小 * \param[in] bitOrder LSB First * \arg 0 Data is transferred MSB first * \arg 1 Data is transferred LSB first * @param[in] baudrate SPI通信速度设置 * @return None */ void SPI_CTARConfig(uint32_t instance, uint32_t ctar, SPI_FrameFormat_Type frameFormat, uint8_t dataSize, uint8_t bitOrder, uint32_t baudrate) { SPI_Type *SPIx; uint32_t clock; SPIx = SPI_InstanceTable[instance]; /* data size */ SPIx->CTAR[ctar] &= ~SPI_CTAR_FMSZ_MASK; SPIx->CTAR[ctar] |= SPI_CTAR_FMSZ(dataSize-1); /* bit order */ switch(bitOrder) { case kSPI_MSB: SPIx->CTAR[ctar] &= ~SPI_CTAR_LSBFE_MASK; break; case kSPI_LSB: SPIx->CTAR[ctar] |= SPI_CTAR_LSBFE_MASK; break; default: break; } /* frame format */ switch(frameFormat) { case kSPI_CPOL0_CPHA0: SPIx->CTAR[ctar] &= ~SPI_CTAR_CPOL_MASK; SPIx->CTAR[ctar] &= ~SPI_CTAR_CPHA_MASK; break; case kSPI_CPOL0_CPHA1: SPIx->CTAR[ctar] &= ~SPI_CTAR_CPOL_MASK; SPIx->CTAR[ctar] |= SPI_CTAR_CPHA_MASK; break; case kSPI_CPOL1_CPHA0: SPIx->CTAR[ctar] |= SPI_CTAR_CPOL_MASK; SPIx->CTAR[ctar] &= ~SPI_CTAR_CPHA_MASK; break; case kSPI_CPOL1_CPHA1: SPIx->CTAR[ctar] |= SPI_CTAR_CPOL_MASK; SPIx->CTAR[ctar] |= SPI_CTAR_CPHA_MASK; break; default: break; } /* set SPI clock, SPI use Busclock */ clock = GetClock(kBusClock); dspi_hal_set_baud(instance, ctar, baudrate, clock); /* add more CS time */ SPIx->CTAR[ctar] |= SPI_CTAR_ASC(1)|SPI_CTAR_CSSCK(1)|SPI_CTAR_PASC(1)|SPI_CTAR_PCSSCK(1); }
/** * @brief SPI数据帧配置 * @note 内部函数,用户无需调用 * @retval None */ void SPI_FrameConfig(uint32_t instance, uint32_t ctar, SPI_FrameFormat_Type frameFormat, uint8_t dataSize, uint8_t bitOrder, uint32_t baudrate) { uint32_t clock; /* data size */ SPI_InstanceTable[instance]->CTAR[ctar] &= ~SPI_CTAR_FMSZ_MASK; SPI_InstanceTable[instance]->CTAR[ctar] |= SPI_CTAR_FMSZ(dataSize-1); /* bit order */ switch(bitOrder) { case kSPI_MSBFirst: SPI_InstanceTable[instance]->CTAR[ctar] &= ~SPI_CTAR_LSBFE_MASK; break; case kSPI_LSBFirst: SPI_InstanceTable[instance]->CTAR[ctar] |= SPI_CTAR_LSBFE_MASK; break; default: break; } /* frame format */ switch(frameFormat) { case kSPI_CPOL0_CPHA0: SPI_InstanceTable[instance]->CTAR[ctar] &= ~SPI_CTAR_CPOL_MASK; SPI_InstanceTable[instance]->CTAR[ctar] &= ~SPI_CTAR_CPHA_MASK; break; case kSPI_CPOL0_CPHA1: SPI_InstanceTable[instance]->CTAR[ctar] &= ~SPI_CTAR_CPOL_MASK; SPI_InstanceTable[instance]->CTAR[ctar] |= SPI_CTAR_CPHA_MASK; break; case kSPI_CPOL1_CPHA0: SPI_InstanceTable[instance]->CTAR[ctar] |= SPI_CTAR_CPOL_MASK; SPI_InstanceTable[instance]->CTAR[ctar] &= ~SPI_CTAR_CPHA_MASK; break; case kSPI_CPOL1_CPHA1: SPI_InstanceTable[instance]->CTAR[ctar] |= SPI_CTAR_CPOL_MASK; SPI_InstanceTable[instance]->CTAR[ctar] |= SPI_CTAR_CPHA_MASK; break; default: break; } /* set SPI clock, SPI use Busclock */ CLOCK_GetClockFrequency(kBusClock, &clock); dspi_hal_set_baud(instance, ctar, baudrate, clock); }
void spi_frequency(spi_t *obj, int hz) { uint32_t busClock; clock_manager_get_frequency(kBusClock, &busClock); dspi_hal_set_baud(obj->instance, kDspiCtar0, (uint32_t)hz, busClock); }