怎么用SPI驱动WS2812 LED
现在只有第一个灯绿呢?
- <#include
- #include
- #include "cmsis_os2.h"
- #include "ohos_init.h"
- #include "wifiiot_spi.h"
- #include "wifiiot_gpio.h"
- #include "wifiiot_gpio_ex.h"
- #include "wifiiot_gpio_w800.h"
- #define LED_TASK_STACK_SIZE 1024
- #define LED_TASK_PRIO 25
- #define SetLEDBtNumber 24
- #define SetLEDNumber 12
- #define T0 0xC0
- #define T1 0xFC
- #define RET 0X00
- #define RET1 0XFF
- enum LedAnimation {
- LED_An1 = 0,
- LED_An2,
- LED_AnInit,
- };
- enum LedAnimation g_ledAnimation = LED_AnInit;
- static void* GpioTask(const char* arg)
- {
- (void)arg;
- while (1) {
- switch (g_ledAnimation) {
- case LED_An1:
- printf(" LED_ON! n");
- osDelay(500);
- break;
- case LED_An2:
- printf(" LED_OFF! n");
- osDelay(500);
- break;
- case LED_AnInit:
- printf(" LED_SPARK! n");
- unsigned char writeData[] = {
- // RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,
- // RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET, /*复位*/
- // RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,RET,
- T1,T1,T1,T1,T1,T1,T1,T1,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,
- T1,T1,T1,T1,T1,T1,T1,T1,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,
- T1,T1,T1,T1,T1,T1,T1,T1,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,
- T1,T1,T1,T1,T1,T1,T1,T1,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0,T0
- };
- SpiHostWrite(WIFI_IOT_IO_NAME_GPIO_2,writeData,sizeof(writeData));
- osDelay(0.4);
- break;
- default:
- osDelay(500);
- break;
- }
- }
- return NULL;
- }
- static void GpioIsr(char* arg)
- {
- (void)arg;
- enum LedAnimation nextAnimation = LED_AnInit;
- printf(" GpioIsr entryn");
- GpioSetIsrMask(WIFI_IOT_GPIO_PB_09, 0);
- switch (g_ledAnimation) {
- case LED_An1:
- nextAnimation = LED_An2;
- break;
- case LED_An2:
- nextAnimation = LED_AnInit;
- break;
- case LED_AnInit:
- nextAnimation = LED_An1;
- break;
- default:
- break;
- }
- g_ledAnimation = nextAnimation;
- }
- static void GpioExampleEntry(void)
- {
- osThreadAttr_t attr;
- GpioInit();
- WifiIotSpiCfgInitParam param = {0x1,0x0};
- WifiIotSpiCfgBasicInfo SpiParameters = {WIFI_IOT_SPI_CFG_clock_CPOL_0/*沟通的极性*/,
- WIFI_IOT_SPI_CFG_CLOCK_CPHA_0/*通信阶段*/,
- WIFI_IOT_SPI_CFG_FRAM_MODE_MOTOROLA/*通信协议*/,
- WIFI_IOT_SPI_CFG_DATA_WIDTH_E_8Bit/*通讯数据宽度*/,
- WIFI_IOT_SPI_CFG_ENDIAN_LITTLE/*尾数法模式*/,
- 0x0/*填充位*/,6.400000/*沟通的频率*/};
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_SPI1_TXD); /*设置io为spi输出模式*/
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUTPUT); /*设置PB引脚为输出*/
- IoSetPull(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_ATTR_PULLLOW); /*设置下拉模式*/
- SpiInit(WIFI_IOT_IO_NAME_GPIO_2,param,&SpiParameters); /*SPI初始化*/
- SpiSetBasicInfo(WIFI_IOT_IO_NAME_GPIO_2,&SpiParameters); /*设置SPI参数*/
- GpioSetDir(WIFI_IOT_GPIO_PB_08, WIFI_IOT_GPIO_DIR_OUTPUT); // output is 0 PB08 control led
- GpioSetDir(WIFI_IOT_GPIO_PB_09, WIFI_IOT_GPIO_DIR_INPUT); // input is PB09
- IoSetPull(WIFI_IOT_GPIO_PB_09, WIFI_IOT_GPIO_ATTR_PULLHIGH);
- GpioRegisterIsRFunc(WIFI_IOT_GPIO_PB_09, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, GpioIsr, NULL);
- attr.name = "GpioTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = LED_TASK_STACK_SIZE;
- attr.priority = LED_TASK_PRIO;
- if (osThreadNew((osThreadFunc_t)GpioTask, NULL, &attr) == NULL) {
- printf("[GpioExample] Falied to create GpioTask!n");
- }
- }
- SYS_RUN(GpioExampleEntry); // if test add it
复制代码
灯呢?
|
|
1 条评论
-
2021-10-18 23:36
spi驱动ws2812,搞定了吗?
|
|
|