gpt4 book ai didi

c - 如何在不影响其他位的情况下将 uint8_t 放在 uint16_t 中间

转载 作者:行者123 更新时间:2023-12-01 13:27:37 26 4
gpt4 key购买 nike

我正在为使用 16 位 SPI 消息的 DAC 芯片编写 SPI 驱动程序...表示输出的值是从第 11 位到第 4 位(8 位 DAC)。我已经写了这个 MASK 但我不知道如何在不影响其他位的情况下实现数据更新:

#define MCP4901_SPI_MASK_DATA               0x0FF0
//So data mask in binary is 0000 1111 1111 0000

extern uint16_t mcpA;

static inline void mcpSetData(uint16_t* mcp, uint8_t value) {
//????
*mcp =| value & MCP4901_SPI_MASK_DATA; //NOT WORKING
}

最佳答案

你对 |& 这两个操作的使用是正确的,但是你没有按正确的顺序使用它们,而且你没有定位其中一个正确操作。

正确的做法是:

*mcp &= ~MCP4901_SPI_MASK_DATA; // Clear out the middle bits
*mcp |= ((uint16_t)value) << 4; // Put in the value in the middle

由于您正在写入硬件寄存器,因此应使用单次写入以避免可能的副作用:

*mcp = (*mcp & ~MCP4901_SPI_MASK_DATA) | (((uint16_t)value) << 4);

MCP4901_SPI_MASK_DATA 被反转以清除 0x0FF0 之外的位。或者,您可以将掩码定义为 0xF00F,并删除 ~ 运算符。

将 8 位值左移 4 位,使其位于 16 位的中间,然后再将其“或”运算为数字。

Demo.

关于c - 如何在不影响其他位的情况下将 uint8_t 放在 uint16_t 中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47738930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com