DMA-SPI-MOSI 輸出直接驅動 WS2812 三基色彩燈@8H/32G系列, CPU休息
SPI方案, 不加外部反相器:
只用到MOSI驅動WS2812,但由于SPI的3個信號是捆綁在一起的
===MISO不能做它用
本例使用P1.3-MOSI輸出驅動信號,用戶可以切換到別的腳。
===將 MISO 不做其他用途;
===將 MISO管腳 先設置為對外輸出0;
===MOSI 發送完成后,對外停止時輸出的是 MISO 讀到的狀態, 0 !
===SCLK如要做其他用途,可設置為高阻輸入,作為輸入使用
這 SPI 留了這么個絕活 支持 WS2812B !。
本例驅動60個燈,接成環狀。SPI發送720字節,DMA分3塊發送,一塊240字節,
SPI-DMA自動傳送不占CPU時間,SPI-DMA 總耗時2.08mS,
===但由于使用DMA中斷處理,所以發送占CPU時間只有幾uS。
===實際幾乎 不占 CPU 時間
每個燈3個字節,分別對應綠、紅、藍色,MSB先發.
800KHz碼率, 數據0(1/4占空比): H=0.3125us L=0.9375us, 數據1(3/4占空比): H=0.9375us L=0.3125us, RESET>=50us.
高電平時間要精確控制在要求的范圍內, 低電平時間不需要精確控制, 大于要求的最小值并小于RES的50us即可.
WS2812S的標準時序如下:
TH+TL = 1.25us±150ns, RES>50us
T0H = 0.25us±150ns = 0.10us - 0.40us
T0L = 1.00us±150ns = 0.85us - 1.15us
T1H = 1.00us±150ns = 0.85us - 1.15us
T1L = 0.25us±150ns = 0.10us - 0.40us
兩個位數據之間的間隔要小于RES的50us.
SPI方案:
只用到MOSI驅動WS2812,但由于SPI的3個信號是捆綁在一起的,MISO 不能做它用。本例使用P1.3-MOSI輸出驅動信號,用戶可以切換到別的腳。
===將 MISO 不做其他用途;
===將 MISO管腳 先設置為對外輸出0;
===MOSI 發送完成后,對外停止時輸出的是 MISO 讀到的狀態, 0 ,這 STC-R&D 留了這么個絕活支持 WS2812B !。
用SPI傳輸, 速度3.0~3.5MHz,以3.2MHz為最佳, MSB先發, 每個字節高4位和低4位分別對應一個WS2812位數據, 1000為數據0, 1110為數據1, 有DMA就使用DMA傳輸, 沒有DMA就直接SPI發送.
MOSI數據位 D7 D6 D5 D4 D3 D2 D1 D0
MOSI數據 1 0 0 0 1 1 1 0
WS2812數據0 WS2812數據1
SPI數據高半字節對應的WS2812數據0-->0x80, 數據1-->0xE0,
SPI數據低半字節對應的WS2812數據0-->0x08, 數據1-->0x0E,
主頻25.6MHz, SPI分頻8 = 3.2MHz。最佳。本例使用。
主頻24.0MHz, SPI分頻8 = 3.0MHz。本例可用。
主頻12.8MHz, SPI分頻4 = 3.2MHz。最佳。用戶要改下主頻定義和SPI為4分頻。
主頻12.0MHz, SPI分頻4 = 3.0MHz。用戶要改下主頻定義,SPI為4分頻。
開源程序
下面為跑馬燈效果視頻:
1.png (562.13 KB, 下載次數: 0)
下載附件
2024-11-20 14:15 上傳
2.jpg (86.19 KB, 下載次數: 0)
下載附件
2024-11-20 14:15 上傳
|