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.

TMS320F280025C: Driverlib Functions中的CLB_configSPIBufferShift函数错误

Part Number: TMS320F280025C
Other Parts Discussed in Thread: C2000WARE

C2000Ware_5_00_00_00\driverlib\f28002x\driverlib\clb.h中的CLB_configSPIBufferShift函数如下

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

其中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。应该是函数编写错误。

函数应该改成

Fullscreen
1
2
3
4
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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX