近幾年烧颖,PC領域隨著電競類的鍵盤鼠標加燈的風潮弱左,各種帶有花式“光污染”的PC外設被推到市場上來,這些“神光同步”的PC外設背后離不開高性能MCU去協(xié)助點燈這項工作倒信,反正神光一亮性能立馬提升10%科贬。
在燈光方案的選擇上,WS2812這類單線制串行LED燈珠被應用的最廣鳖悠,而且很多LPC Inside的鍵鼠設備也許正躺在各位臭打游戲的桌面上,所以本文以WS2812為基礎优妙,逐一介紹如何用LPC單片機上的不同的外設實現(xiàn)同樣的驅動WS2812這類串行LED燈帶乘综。
這個系列我計劃分成3篇,這是第一篇講基礎和SPI的方式實現(xiàn)套硼,第二篇講SCT卡辰,EZH的實現(xiàn),雙核點燈,第三篇講如何移植NeoPixel-KnightRider到MCU九妈,實現(xiàn)花式點燈反砌。
首先介紹下WS2812
WS2812是一種5050封裝,集成了電流控制芯片的低功耗的RGB三色燈萌朱,是各種LED燈帶的靈魂所在宴树。WS2812采用串行級連接口,可以實現(xiàn)256級亮度的三基色顏色顯示即完成16777216種顏色的顯示且掃描頻率不低于400Hz晶疼,刷新速率30幀/秒時酒贬,級連數(shù)不小于1024點,串行數(shù)據(jù)發(fā)送速度可達800Kbps翠霍。
WS2812燈帶在淘寶上有各種規(guī)格:66燈的锭吨,144燈的,密封的5m寒匙,密封的1m零如,裸露的5m,裸露的1m锄弱,等等埠况。
WS2812 功能引腳
WS2812 級聯(lián)
WS2812 時序波形圖
WS2812 RGB數(shù)據(jù)結構
如何用LPC55S69 驅動WS2812
了解完WS2812的時序后,我們分析下LPC55S69上的外設棵癣,目前評估下來辕翰,可以用LPC55S69上的SPI,SCT定時器狈谊,EZH或者用雙核里的那個小核控制GPIO口 這四種方案來實現(xiàn)喜命,本文會介紹SPI的方式,之后的文章會分別介紹SCT河劝,EZH以及雙核實現(xiàn)壁榕。
利用LPC55S69的SPI接口實現(xiàn)WS2812的控制
實現(xiàn)分析
由分析WS2812的時序可知,0碼和1碼代表的是占空比的不同赎瞎,我們可以用SPI傳輸?shù)?個bit中的1和0的個數(shù)不同來表示0碼和1碼牌里,即0碼可以是由 01110000 來表示,1碼可以是01111100來表示务甥。
WS2812的基礎通信時鐘是800kbps牡辽,SPI是8bit傳輸?shù)模許PI的時鐘頻率應該定在800kbps x 8 = 6.4Mbps
這樣我們就可以建立一個WS2812顯示顏色用的數(shù)組uint8_t g_WS2812TxBuf[WS2812_PIXELS*24+100]敞临,x24 的原因是一個WS2812需要RBG 3個色元态辛,各8bit。
雖然用SPI控制WS2812比較簡單挺尿,但是各位看官也看到了奏黑,這種辦法是比較吃RAM的炊邦, 還好LPC55系列的RAM都不是一般的大,足夠應對熟史。
復位
WS2812的50uS以上的低電平復位信號是比較容易實現(xiàn)馁害,可以通過控制GPIO的高低狀態(tài)就可以實現(xiàn)。當然我們也已利用SPI發(fā)送數(shù)據(jù)0實現(xiàn)蹂匹,LPC55的這個demo我們是用SPI發(fā)送0數(shù)據(jù)產(chǎn)生復位信號的碘菜,我們把用于SPI發(fā)送的數(shù)據(jù)額外多設置100個字節(jié),開始的100個字節(jié)填充0怒详,這樣我們就可以產(chǎn)生復位信號了炉媒。
時鐘精度
結合LPC55的SDK,為了得到比較精確的6.8Msps的SPI傳輸速率昆烁,我們得把MCU的主頻提升至比較高的級別吊骤,這里我們用LPC55上的96MHz的高速FRO作為MCU的時鐘源,這樣可以達到比較好的能耗平衡静尼。
將SDK里SPI初始化中關于時鐘部分改成6800000Hz白粉。
在96MHz基礎上去得到6.8MHz是肯定有偏差的,實際我們得到的SPI時鐘頻率是6.857MHz鼠渺,好在WS2812實際允許的150nS的偏差的鸭巴。我們這種方法實際是可以完美驅動WS2812的。
當然如果是強迫癥拦盹,我們可以用LPC55上的PLL來生成完美匹配6.8MHz的頻率的主頻鹃祖,比如68MHz,136MHz等給內(nèi)核用普舆。這樣做無非是略微增加了一點功耗恬口。
用輪詢(Polling)的方式實現(xiàn)SPI數(shù)據(jù)傳遞給WS2812
輪詢的方式實現(xiàn)比較簡單,我們傳輸?shù)氖枪潭ǖ臄?shù)據(jù)沼侣,所以我就沒有用SDK的標準API祖能,自己實現(xiàn)了非常直接的發(fā)送函數(shù)
點燈前別忘設置燈的個數(shù)
如果我們用的WS2812燈帶有8個燈,在drv_ws2812_spi.h里修改LED的數(shù)量
接下來蛾洛,如果我們要把WS2812按照流水燈的方式养铸,顯示RGB 三原色。則按照順序轧膘,輪流修改g_WS2812TxBuf中的數(shù)據(jù)組合即可钞螟。