ws2812/6810 RGB灯带在高通芯片上的控制
前段時間開發(fā)ws2812驅(qū)動。網(wǎng)上有一些參考,但是全部是在單片機上用pwm實現(xiàn),估計是考慮實時性和時間高精度要求。
而我的項目的架構(gòu)中,就只有一個高通的8939,并且只有一路pwm,還被紅外ir給霸占了,被逼到墻角了。沒辦法,活還的干,想到用其他頻率高的通訊方式。
最后嘗試了幾種,選擇了spi+bam的方式,這玩意就類似spi+dma,只是bam是高通家定義的。
ws2812們的要求如下:
思路如下:
1、選擇合適高的頻率,例如4.8MHZ或者9.6MHZ,我選用9.6M,這樣spi傳1bit花的時間大概是100ns;
2、結(jié)合上面的數(shù)據(jù)傳輸時間,換算出0碼和1碼的組合數(shù)據(jù);
3、輸入rgb的數(shù)組,例如(255,0,0)這個是紅色,換算出相應(yīng)的要發(fā)送的數(shù)據(jù),放到spidev的tx buffer中。
for(i =0; i<8; i++){
temp = ((pData[0]<<i)&0x80) ? logic_one:logic_zero;
spidev_t->buffer[next++]=(temp>>8)&0xff;
spidev_t->buffer[next++]=(temp)&0xff;
}
pData[0]就是上面255,g和b的數(shù)據(jù)轉(zhuǎn)換采用一樣的方式。
4、把轉(zhuǎn)換的數(shù)據(jù)全部轉(zhuǎn)換完以后,就放到
status = spidev_sync_write(spidev, (size_t)next);
進(jìn)行傳輸。
這樣就完成了數(shù)據(jù)的傳輸,這樣就可以亮起一個燈。想要亮多個燈,就在這個數(shù)據(jù)轉(zhuǎn)換外面(第三步)加上一個led_nums的循環(huán)就可以了。注意,全部的數(shù)據(jù)轉(zhuǎn)換完了,這個時候才執(zhí)行(第四步)。
但是,不要以為這樣就能輕易的按照你的想法點亮,坑還在后面,硬件坑(碰到這種情況,直接diao硬件)。
=================軟硬分割線=================
硬件一定要看清楚ws這家伙的電器特性并且按照電器特性連接電路和供電,不然會讓軟件懷疑自己的實現(xiàn)能力的。直接上圖,一看就知道了。
*高通的芯片gpio是1.8v 輸出,要做電平轉(zhuǎn)換。
插曲:
之前試過的幾種方法中,有一種是gpio操作,發(fā)現(xiàn)時間精度達(dá)不到,我不調(diào)用它的封裝函數(shù),直接操作寄存器,測量出來的最低時間那就400ns多,所以不滿足要求,放棄了。
完結(jié)。
總結(jié)
以上是生活随笔為你收集整理的ws2812/6810 RGB灯带在高通芯片上的控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苏州新闻网V2.0 新版上线
- 下一篇: 【Python】第2次作业:同符号数学运