基于数据在 C 中创建数组 sheet
Creating arrays in C based on data sheet
我对 c 语言非常陌生(通常是 obj-c、swift),并且我正在使用一些 Cypress BLE 开发板。我正在尝试控制一个简单的 LED。
根据 the documentation 我应该简单地写入 SPI 总线来控制 LED。
相关部分如下:
所以我写了32位的0开始。然后是RGB数组。然后是全 1 的 32 位。这是我目前正在尝试的:
static uint8 startFrame[32] = {0,0,0,0};
static uint8 colorFrame[32] = {1, 255, 0, 0};
static uint8 endFrame[32] = {1,1,1,1};
SPI_1_SpiUartPutArray(startFrame, 32);
SPI_1_SpiUartPutArray(colorFrame, 32);
SPI_1_SpiUartPutArray(endFrame, 32);
我的想法是 int
是 8 位,所以 {1,1,1,1}
的大小应该是 32。再一次,我是非常新的并且通过黑客攻击我的方式。非常感谢任何帮助!
SPI_1_SpiUartPutArray
的文档:
/*******************************************************************************
* Function Name: SPI_1_SpiUartPutArray
****************************************************************************//**
*
* Places an array of data into the transmit buffer to be sent.
* This function is blocking and waits until there is a space available to put
* all the requested data in the transmit buffer. The array size can be greater
* than transmit buffer size.
*
* \param wrBuf: pointer to an array of data to be placed in transmit buffer.
* The width of the data to be transmitted depends on TX data width selection
* (the data bit counting starts from LSB for each array element).
* \param count: number of data elements to be placed in the transmit buffer.
*
* \globalvars
* SPI_1_txBufferHead - the start index to put data into the
* software transmit buffer.
* SPI_1_txBufferTail - start index to get data from the software
* transmit buffer.
*
*******************************************************************************/
void SPI_1_SpiUartPutArray(const uint8 wrBuf[], uint32 count)
{
uint32 i;
for (i=0u; i < count; i++)
{
SPI_1_SpiUartWriteTxData((uint32) wrBuf[i]);
}
}
我也试过这个:
static uint8 startFrame[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static uint8 colorFrame[32] = {1,1,1, 1,1,1,1,1 , 1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0};
static uint8 endFrame[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
还有这个:
static uint8 startFrame[4] = {0x00, 0x00, 0x00, 0x00};
static uint8 colorFrame[4] = {0xff, 0xff, 0xff, 0xff};
static uint8 endFrame[4] = {0xff, 0xff, 0xff ,0xff};
SPI_1_SpiUartPutArray(startFrame, 4);
SPI_1_SpiUartPutArray(colorFrame, 4);
SPI_1_SpiUartPutArray(endFrame, 4);
还有这个:
static uint8 startFrame[4] = {0,0,0,0};
static uint8 colorFrame[4] = {255, <R>, <G>, <B>};
static uint8 endFrame[4] = {255,255,255,255};
SPI_1_SpiUartPutArray(startFrame, 4);
SPI_1_SpiUartPutArray(colorFrame, 4); // multiple of these for each LED
SPI_1_SpiUartPutArray(endFrame, 4);
如果上述任何设置都是正确的,那一定是我写入 SPI 的方式有问题。
您可能会遇到一些问题。
首先...SPI 通常或多或少是事务性的。与 UART(作为常见的反例)不同,您不会随心所欲地编写任何内容。您通常需要切换筹码 select(有时 "slave select"),一次一个 "clock out" 个单词,然后以另一种方式切换筹码 select。没有关于 SPI_1_SpiUartPutArray()
的文档,很难说您是否可以在同一次传输中多次调用它(在芯片 select 切换之间)。
编辑: 芯片 select 没关系。这个LED驱动好像没有芯片select/enable线。请注意以供将来参考,这对于 SPI 来说是不寻常的。
第二个问题 - 我假设 SPI_1_SpiUartPutArray()
一次输出 BYTES,而不是位。同样,您没有提供该功能的文档,因此很难说。如果我的假设是正确的,您会希望 startFrame
为 static uint8 startFrame[4] = {0xff, 0xff, 0xff, 0xff};
,因为一个字节中有 8 位,为您提供 32 位帧起始。同样的想法适用于颜色和帧结束。
第三个问题 - 如果我对 SPI 函数的工作方式有误,则说明您没有完全初始化这些数组。您声明了 32 字节 的数组,然后只初始化其中的 4 个。
你必须将 startFrame 声明为 uint8 的 4 元素数组,而不是 256 位长的 uint8 的 32 元素,因此如果 SPI_1_SpiUartPutArray 的第二个参数是要写入 SPI 的字节数,你有放 4(4 字节 - 32 位),而不是 32(256 位)
static uint8 startFrame[4];
SPI_1_SpiUartPutArray(startFrame, 4);
您需要将数组大小更改为 4 而不是 32。uint8 已经有 8 位,其中 4 位意味着 32 位。现在除非你使用一些非标准库,否则你需要一些数学知识来说明哪些位设置为 1 哪些位设置为 0。例如,将 31 = 00001111b 放在一个字节中意味着你正在设置前 4位为 0,最后 4 位为 1。因此,在您的情况下,代码为:
static uint8 startFrame[4] = {0,0,0,0};
static uint8 colorFrame[4] = {255, <R>, <G>, <B>};
static uint8 endFrame[4] = {255,255,255,255};
SPI_1_SpiUartPutArray(startFrame, 4);
SPI_1_SpiUartPutArray(colorFrame, 4); // multiple of these for each LED
SPI_1_SpiUartPutArray(endFrame, 4);
我对 c 语言非常陌生(通常是 obj-c、swift),并且我正在使用一些 Cypress BLE 开发板。我正在尝试控制一个简单的 LED。
根据 the documentation 我应该简单地写入 SPI 总线来控制 LED。
相关部分如下:
所以我写了32位的0开始。然后是RGB数组。然后是全 1 的 32 位。这是我目前正在尝试的:
static uint8 startFrame[32] = {0,0,0,0};
static uint8 colorFrame[32] = {1, 255, 0, 0};
static uint8 endFrame[32] = {1,1,1,1};
SPI_1_SpiUartPutArray(startFrame, 32);
SPI_1_SpiUartPutArray(colorFrame, 32);
SPI_1_SpiUartPutArray(endFrame, 32);
我的想法是 int
是 8 位,所以 {1,1,1,1}
的大小应该是 32。再一次,我是非常新的并且通过黑客攻击我的方式。非常感谢任何帮助!
SPI_1_SpiUartPutArray
的文档:
/*******************************************************************************
* Function Name: SPI_1_SpiUartPutArray
****************************************************************************//**
*
* Places an array of data into the transmit buffer to be sent.
* This function is blocking and waits until there is a space available to put
* all the requested data in the transmit buffer. The array size can be greater
* than transmit buffer size.
*
* \param wrBuf: pointer to an array of data to be placed in transmit buffer.
* The width of the data to be transmitted depends on TX data width selection
* (the data bit counting starts from LSB for each array element).
* \param count: number of data elements to be placed in the transmit buffer.
*
* \globalvars
* SPI_1_txBufferHead - the start index to put data into the
* software transmit buffer.
* SPI_1_txBufferTail - start index to get data from the software
* transmit buffer.
*
*******************************************************************************/
void SPI_1_SpiUartPutArray(const uint8 wrBuf[], uint32 count)
{
uint32 i;
for (i=0u; i < count; i++)
{
SPI_1_SpiUartWriteTxData((uint32) wrBuf[i]);
}
}
我也试过这个:
static uint8 startFrame[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static uint8 colorFrame[32] = {1,1,1, 1,1,1,1,1 , 1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0};
static uint8 endFrame[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
还有这个:
static uint8 startFrame[4] = {0x00, 0x00, 0x00, 0x00};
static uint8 colorFrame[4] = {0xff, 0xff, 0xff, 0xff};
static uint8 endFrame[4] = {0xff, 0xff, 0xff ,0xff};
SPI_1_SpiUartPutArray(startFrame, 4);
SPI_1_SpiUartPutArray(colorFrame, 4);
SPI_1_SpiUartPutArray(endFrame, 4);
还有这个:
static uint8 startFrame[4] = {0,0,0,0};
static uint8 colorFrame[4] = {255, <R>, <G>, <B>};
static uint8 endFrame[4] = {255,255,255,255};
SPI_1_SpiUartPutArray(startFrame, 4);
SPI_1_SpiUartPutArray(colorFrame, 4); // multiple of these for each LED
SPI_1_SpiUartPutArray(endFrame, 4);
如果上述任何设置都是正确的,那一定是我写入 SPI 的方式有问题。
您可能会遇到一些问题。
首先...SPI 通常或多或少是事务性的。与 UART(作为常见的反例)不同,您不会随心所欲地编写任何内容。您通常需要切换筹码 select(有时 "slave select"),一次一个 "clock out" 个单词,然后以另一种方式切换筹码 select。没有关于 SPI_1_SpiUartPutArray()
的文档,很难说您是否可以在同一次传输中多次调用它(在芯片 select 切换之间)。
编辑: 芯片 select 没关系。这个LED驱动好像没有芯片select/enable线。请注意以供将来参考,这对于 SPI 来说是不寻常的。
第二个问题 - 我假设 SPI_1_SpiUartPutArray()
一次输出 BYTES,而不是位。同样,您没有提供该功能的文档,因此很难说。如果我的假设是正确的,您会希望 startFrame
为 static uint8 startFrame[4] = {0xff, 0xff, 0xff, 0xff};
,因为一个字节中有 8 位,为您提供 32 位帧起始。同样的想法适用于颜色和帧结束。
第三个问题 - 如果我对 SPI 函数的工作方式有误,则说明您没有完全初始化这些数组。您声明了 32 字节 的数组,然后只初始化其中的 4 个。
你必须将 startFrame 声明为 uint8 的 4 元素数组,而不是 256 位长的 uint8 的 32 元素,因此如果 SPI_1_SpiUartPutArray 的第二个参数是要写入 SPI 的字节数,你有放 4(4 字节 - 32 位),而不是 32(256 位)
static uint8 startFrame[4];
SPI_1_SpiUartPutArray(startFrame, 4);
您需要将数组大小更改为 4 而不是 32。uint8 已经有 8 位,其中 4 位意味着 32 位。现在除非你使用一些非标准库,否则你需要一些数学知识来说明哪些位设置为 1 哪些位设置为 0。例如,将 31 = 00001111b 放在一个字节中意味着你正在设置前 4位为 0,最后 4 位为 1。因此,在您的情况下,代码为:
static uint8 startFrame[4] = {0,0,0,0};
static uint8 colorFrame[4] = {255, <R>, <G>, <B>};
static uint8 endFrame[4] = {255,255,255,255};
SPI_1_SpiUartPutArray(startFrame, 4);
SPI_1_SpiUartPutArray(colorFrame, 4); // multiple of these for each LED
SPI_1_SpiUartPutArray(endFrame, 4);