我必须通过I2C发送带有数据像素的缓冲区,但首先,我必须使用显示命令为缓冲区附加一个额外的字节。如何在C中执行此操作?
//
// Send a data byte sequence to the GDDRAM
//
static void ssd1306_WriteData(uint8_t *buffer,uint16_t length)
{
uint8_t data[2] = {
CNTRL_BYTE_SEND_DATA, /* 0x40 */
buffer /* this does not work, I try to find a way to combine two buffers */
};
HAL_I2C_Master_Transmit(&SSD1306_I2C_PORT,SSD1306_I2C_ADDR,data,length,timeout);
}
详细地说,我具有低级I2C函数,该函数具有一个指针uint8_t数据作为参数,该数据用于通过总线发送的缓冲区以及缓冲区的长度。
我想为应用程序软件编写一个功能,应用程序可以使用该功能将缓冲区发送到显示器,但是首先,总线必须将数据流即将到来的命令发送到显示控制器。
我不能两次调用传输,因为这样控制器将在总线上两次发送从属地址。
我不想使用memcpy
。
首先malloc()
具有额外长度的缓冲区。然后使用memcpy()
放置0x40
,然后复制缓冲区。我对字节的处理总是有点不同。
volatile uint8_t data[2];
data[0] = address | 0x40; // multibyte write enabled
data[1] = value;
在您的情况下,您需要使用malloc() & memcpy()
,因为您不确定要发送多少长度。
另一个解决方案是先发送第一个0x40
,然后发送其余的缓冲区(如果您的情况可行,请发送idk)。
或记住多余的字节,然后执行buffer | 0x4000
,其中零的总数是您可以通过uint32_t variable = 0x40;
和variable << length*2;
轻松设置的偏移量。使用这种方法时,您必须牢记额外的缓冲区长度。