ToB企服应用市场:ToB评测及商务社交产业平台
标题:
鸿蒙OSHI3861开发板SPI使用
[打印本页]
作者:
鼠扑
时间:
2022-6-24 05:05
标题:
鸿蒙OSHI3861开发板SPI使用
HI3861 SPI控制WS2812使用记录
WiFi连接类开发文档
环境搭建可以参考这个
当然也可以参考小熊派的教程
WS2812驱动方式为归零码传输方式高位在前。下图为数据传输时间以及
0码
,
1码
,
复位码
高低电平持续时间
我们通过延时翻转电平来达到数据的发送,但是这样会浪费很多CPU的时间
另一种方式则是
SPI
+
DMA
的方式大大节省CPU的时间
数据传输时间为1.25us+600ns这里我们选择SPI速率为7M这样SPI发送一个位就是142ns左右那么
0码
就是142
3=428ns
1码
是142
6=850ns复位就是1.142us刚好和手册差距不大
对应的
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,¶m);//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
[code]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(i8&&i
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4