鸿蒙OSHI3861开发板SPI使用

HI3861 SPI控制WS2812使用记录

WiFi连接类开发文档
环境搭建可以参考这个
当然也可以参考小熊派的教程

  1. WS2812驱动方式为归零码传输方式高位在前。下图为数据传输时间以及0码1码复位码高低电平持续时间
  2. 我们通过延时翻转电平来达到数据的发送,但是这样会浪费很多CPU的时间
  3. 另一种方式则是SPI+DMA的方式大大节省CPU的时间
  4. 数据传输时间为1.25us+600ns这里我们选择SPI速率为7M这样SPI发送一个位就是142ns左右那么0码就是1423=428ns1码是1426=850ns复位就是1.142us刚好和手册差距不大
  5. 对应的0码对应的SPI数据为0xe0,1码为0xfc,复位为0x00
    在这里插入图片描述
    下面是SPI初始化代码有些还是不太理解就直接写的也可以用反正
static void spi_init(void)//SPI初始化
{
    char spi_send_buff[2400]={0};
    int ret;
    WifiIotSpiCfgBasicInfo param={0};
    WifiIotSpiCfgInitParam initParam={0};
    initParam.isSlave=0;//主设备
    initParam.pad=0;//不理解
    param.cpha=WIFI_IOT_SPI_CFG_CLOCK_CPOL_0;              //CPOL=0,CPHA=0 时钟信号idle状态为低电平,第一个时钟边沿采样数据,CPOL=0,CPHA=1 时钟信号idle状态为低电平,第二个时钟边沿采样数据。
    param.cpol=WIFI_IOT_SPI_CFG_CLOCK_CPHA_1;              //CPOL=1,CPHA=0 时钟信号idle状态为高电平,第一个时钟边沿采样数据,CPOL=1,CPHA=1 时钟信号idle状态为高电平,第二个时钟边沿采样数据。
    param.dataWidth=WIFI_IOT_SPI_CFG_DATA_WIDTH_E_8BIT;    //传送数据的大小
    param.endian=WIFI_IOT_SPI_CFG_ENDIAN_LITTLE;           // 数据传输是大端模式还是小端模式,这里选择小端模式
    param.framMode=WIFI_IOT_SPI_CFG_FRAM_MODE_MOTOROLA;    //通信协议
    param.freq=7*1000000;                                  //7M    
    param.pad=0;//不理解
    
    ret=SpiInit(WIFI_IOT_SPI_ID_0,initParam,&param);//SPI初始化
    if(ret)
    {
        printf("SPI初始化失败%c!!\r\n",spi_send_buff[0]);
    }
    ret = SpiSetLoopBackMode(WIFI_IOT_SPI_ID_0,0);//关闭回环测试
    if(ret)
    {
        printf("SPI初始化失败!!\r\n");
    }
    ret = SpiSetDmaMode(WIFI_IOT_SPI_ID_0,1);//使能DMA传输
    if(ret)
    {
        printf("DMA初始化失败!!\r\n");
    }    
    GpioInit();
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_IO_FUNC_GPIO_9_SPI0_TXD);
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_GPIO_DIR_OUT);
    SpiSetIrqMode(WIFI_IOT_SPI_ID_0,0);//不启用中断
    
}

点亮一个LED代码,因为WS2812发送的是GRB,这里处理了一下处理成了RGB

void ws2812_light_one(uint32_t send_data)
{
    uint8_t i=0;
    char color_buff[24]={0};
    for ( i = 0; i < 24; i++)
    {
        if (send_data&0x800000)
        {
            if(i<8)
            color_buff[i+8]=0xfc;
            else if(i>8&&i<16)
            color_buff[i-8]=0xfc;
            else color_buff[i]=0xfc;
        }
        else
        {
            if(i<8)
            color_buff[i+8]=0xe0;
            else if(i>8&&i<16)
            color_buff[i-8]=0xe0;
            else color_buff[i]=0xe0;
        }
        send_data=send_data<<1;
    }
    SpiHostWrite((WifiIotSpiIdx)WIFI_IOT_SPI_ID_0,color_buff,(unsigned int)24);
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值