This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
在裸核开发下,在pdk_C6678_1_1_2_6\packages\ti\platform\evmc6678l\platform_lib\src的evmc66x_spi.c代码中:
SPI的初始化中:
SPI_STATUS
spi_claim
(
uint32_t cs,
uint32_t freq
)
{
/* setup format */
scalar = ((SPI_MODULE_CLK / freq) - 1 ) & 0xFF;
if ( cs == 0) {
SPI_SPIFMT0 = (8 << CSL_SPI_SPIFMT_CHARLEN_SHIFT) |
(scalar << CSL_SPI_SPIFMT_PRESCALE_SHIFT) |
(CSL_SPI_SPIFMT_PHASE_DELAY << CSL_SPI_SPIFMT_PHASE_SHIFT) |
(CSL_SPI_SPIFMT_POLARITY_LOW << CSL_SPI_SPIFMT_POLARITY_SHIFT) |
(CSL_SPI_SPIFMT_SHIFTDIR_MSB << CSL_SPI_SPIFMT_SHIFTDIR_SHIFT);
}else if ( cs == 1) {
SPI_SPIFMT0 = (16 << CSL_SPI_SPIFMT_CHARLEN_SHIFT) |
(scalar << CSL_SPI_SPIFMT_PRESCALE_SHIFT) |
(CSL_SPI_SPIFMT_PHASE_NO_DELAY << CSL_SPI_SPIFMT_PHASE_SHIFT) |
(CSL_SPI_SPIFMT_POLARITY_LOW << CSL_SPI_SPIFMT_POLARITY_SHIFT) |
(CSL_SPI_SPIFMT_SHIFTDIR_MSB << CSL_SPI_SPIFMT_SHIFTDIR_SHIFT);
}
}
在SPI SPI_SPIFMT寄存器中计算
文章理解是:
Maximum SPI clock frequency = 166666666 / ( 0 + 1) ----- > with the prescale value as 0
= 166 MHz
Minimum SPI clock frequency = 166666666 / ( 255 + 1) ---> with the pre-scale value as 255
= 651041 Hz --> ~ 660000 Hz
代码scalar = ((SPI_MODULE_CLK / freq) - 1 ) & 0xFF;
为何要取& 0xFF? 例如我要设置SPI freq设置为48M控制始终,最后计算scalar 是143:
166666666/(143+1)=115740=1.1M 最后SPI的CLK输出1.1M时钟吗?
按照scalar = ((SPI_MODULE_CLK / freq) - 1 ) & 0xFF后代码 LOG:
[C66xx_0] SPI_init: SPI spi_iclk= 166666666
SPI_init: SPI spi_iclk= 48000
SPI_init: SPI PRESCALE= 143
SPI_init: spiRegs->SPIFMT[0]= 18f08
SPI_init: SPI spi_iclk= 166666666
SPI_init: SPI spi_iclk= 48000
SPI_init: SPI PRESCALE= 3471
SPI_init: SPI PRESCALE1= 143
SPI_init: spiRegs->SPIFMT[0]= 18f08
代码scalar = ((SPI_MODULE_CLK / freq) - 1 ) & 0xFF;
为何要取& 0xFF?
这个应该是取低8bit, PRESCALE的取值范围是0~FF。