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.
C2000Ware_5_00_00_00\driverlib\f28002x\driverlib\clb.h中的CLB_configSPIBufferShift函数如下
static inline void CLB_configSPIBufferShift(uint32_t base, uint16_t shiftVal) { ASSERT(CLB_isBaseValid(base)); EALLOW; HWREGH(base + CLB_O_SPI_DATA_CTRL_HI) = (HWREGH(base + CLB_O_SPI_DATA_CTRL_HI) & ~((uint16_t)CLB_SPI_DATA_CTRL_HI_SHIFT_M << CLB_SPI_DATA_CTRL_HI_SHIFT_S)) | ((uint16_t)shiftVal << CLB_SPI_DATA_CTRL_HI_SHIFT_S); EDIS; }
其中CLB_SPI_DATA_CTRL_HI_SHIFT_M = 0x1F00,CLB_SPI_DATA_CTRL_HI_SHIFT_S = 8。
函数式整理后得reg_val = reg_val & ~(0x1F00 << 8) | (shiftVal << 8) = reg_val | (shiftVal << 8)。
使用这个函数配置CLB_SPI_DATA_CTRL_HI.SHIFT时,仅对5bit位域的每一位从0到1生效。例如,SHIFT = 00101b,使用函数改变SHIFT值,令shiftVal = 01010b,函数执行结果却是SHIFT = 01111b。应该是函数编写错误。
函数应该改成
HWREGH(base + CLB_O_SPI_DATA_CTRL_HI) = HWREGH(base + CLB_O_SPI_DATA_CTRL_HI) & ~(uint16_t)CLB_SPI_DATA_CTRL_HI_SHIFT_M | ((uint16_t)shiftVal << CLB_SPI_DATA_CTRL_HI_SHIFT_S);