基于数据表在C语言中创建数组

基于数据表在C语言中创建数组,c,arrays,buffer,spi,C,Arrays,Buffer,Spi,我对c语言(obj-c,通常是swift)非常陌生,我正在使用一些Cypress-BLE板。我试图控制一个简单的LED 根据我应该只是写一个SPI总线来控制LED 以下是相关部分: 所以我从0开始写32位。然后是RGB阵列。然后是所有1的32位。以下是我目前正在尝试的: static uint8 startFrame[32] = {0,0,0,0}; static uint8 colorFrame[32] = {1, 255, 0, 0}; static uint8 endFrame[32]

我对c语言(obj-c,通常是swift)非常陌生,我正在使用一些Cypress-BLE板。我试图控制一个简单的LED

根据我应该只是写一个SPI总线来控制LED

以下是相关部分:

所以我从0开始写32位。然后是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}
的大小应该是32。再一次,我是一个非常新的人,我正在努力解决这个问题。非常感谢您的帮助

SPI\u 1\u 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[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);
static uint8开始帧[4]={0,0,0};
静态uint8色框[4]={255,,};
静态uint8端帧[4]={255255};
SPI_1_SpiUartPutArray(起始帧,4);
SPI_1_SpiUartPutArray(彩色边框,4);//每个LED都有多个
SPI_1_SpiUartPutArray(端帧,4);

如果上面的任何设置都是正确的,那么一定是我如何向SPI写入的问题

您可能会遇到一些问题

首先。。。SPI通常或多或少是事务性的。与UART(作为一个常见的反例)不同,您不需要在任何时候编写任何您想要的东西。您通常需要切换芯片选择(有时是“从选择”),“时钟退出”字,一次一个,然后切换芯片选择另一种方式。如果没有关于
SPI\u 1\u SpiUartPutArray()
的文档,很难说您是否可以在同一次传输中多次调用它(芯片间选择切换)

编辑:不要在意芯片上选择的东西。该LED驱动器似乎没有芯片选择/启用线。请注意,这对于SPI来说是不寻常的

第二个问题-我假设
SPI\u 1\u SpiUartPutArray()
一次输出字节,而不是位。同样,您没有提供函数的文档,所以很难说。如果我的假设是正确的,您会希望
startFrame
static uint8 startFrame[4]={0xff,0xff,0xff,0xff}
因为一个字节中有8位,给您一个32位的帧开始。同样的想法也适用于框架的颜色和结尾


第三个问题-如果我对SPI函数的工作方式有错误,那么您没有完全初始化这些数组。声明32字节的数组,然后只初始化其中的4个。

这里可能有几个问题

首先。。。SPI通常或多或少是事务性的。与UART(作为一个常见的反例)不同,您不需要在任何时候编写任何您想要的东西。您通常需要切换芯片选择(有时是“从选择”),“时钟退出”字,一次一个,然后切换芯片选择另一种方式。如果没有关于
SPI\u 1\u SpiUartPutArray()
的文档,很难说您是否可以在同一次传输中多次调用它(芯片间选择切换)

编辑:不要在意芯片上选择的东西。该LED驱动器似乎没有芯片选择/启用线。请注意,这对于SPI来说是不寻常的

第二个问题-我假设
SPI\u 1\u SpiUartPutArray()
一次输出字节,而不是位。同样,您没有提供函数的文档,所以很难说。如果我的假设是正确的,您会希望
startFrame
static uint8 startFrame[4]={0xff,0xff,0xff,0xff}
因为一个字节中有8位,给您一个32位的帧开始。同样的想法也适用于框架的颜色和结尾


第三个问题-如果我对SPI函数的工作方式有错误,那么您没有完全初始化这些数组。声明32字节的数组,然后只初始化其中的4个。

必须声明开始帧uint8的4元素数组,而不是长度为256位的uint8的32元素,因此,如果SPI_1_SpiUartPutArray的第二个参数是要在SPI上写入的字节数,则必须放入4(4字节-32位),而不是32(256位)


您必须声明startFrame是uint8的4元素数组,而不是uint8的32元素,长度为256位,因此,如果SPI_1_SpiUartPutArray的第二个参数是要在SPI上写入的字节数,则必须放入4(4字节-32位),而不是32(256位)


您需要将数组大小更改为4而不是32。uint8已经有8位,其中4位表示32位。现在,除非您使用一些非标准库,否则您需要一些数学知识来说明哪些位设置为1,哪些位设置为0。例如,将31=000011B放入一个字节意味着将前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);
static uint8开始帧[4]={0,0,0};
静态uint8色框[4]={255,,};
静态uint8端帧[4]={255255};
SPI_1_SpiUartPutArray(起始帧,4);
SPI_1_SpiUartPutArray(彩色边框,4);//每个LED都有多个
SPI_1_SpiUartPutArray(端帧,4);

您需要将数组大小更改为4而不是32。uint8已经有8位,其中4位表示32位。现在,除非您使用一些非标准库,否则您需要一些数学知识来说明哪些位设置为1,哪些位设置为0。例如,将31=000011B放入一个字节意味着将前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);
static uint8开始帧[4]={0,0,0};
静态uint8色框[4]={255,,};
静态uint8端帧[4]={255255};
SPI_1_SpiUartPutArray(起始帧,4);
SPI_1_SpiUartPutArray(彩色边框,4);//每个LED都有多个
SPI_1_SpiUartPutArray(端帧,4);

您的
静态uint8端帧[32]={1,1,1}
既不是
1
位的32元素数组(只有前4个元素为1,其他元素为0),也不是
0xFF
字节(32位)的4元素数组。而你似乎只有w
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);