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.

TMS320C6678: 在C6678平台下如何实现SPI驱动功能。

Part Number: TMS320C6678

在裸核开发下,在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

x 出现错误。请重试或与管理员联系。