feat: upgrade to clean 6.0 MHz zero-gap SPI driver for FCOB-2.7 with 5-bit encoding and add 6MHz clock test command
This commit is contained in:
78
App/main.c
78
App/main.c
@@ -128,28 +128,33 @@ void UI_ShowSosPage(void);
|
|||||||
* WS2812B 幻彩 LED 单线驱动函数 (24MHz 1T 模式下精准时序控制)
|
* WS2812B 幻彩 LED 单线驱动函数 (24MHz 1T 模式下精准时序控制)
|
||||||
* ========================================================================= */
|
* ========================================================================= */
|
||||||
|
|
||||||
const u16 code SPI_LUT[16] = {
|
void WS2812_EncodeByte5(u8 v, u8 *buf)
|
||||||
0x924, 0x926, 0x934, 0x936, 0x9A4, 0x9A6, 0x9B4, 0x9B6,
|
|
||||||
0xD24, 0xD26, 0xD34, 0xD36, 0xDA4, 0xDA6, 0xDB4, 0xDB6
|
|
||||||
};
|
|
||||||
|
|
||||||
void WS2812_EncodeByte(u8 v, u8 *buf)
|
|
||||||
{
|
{
|
||||||
u16 p1 = SPI_LUT[v >> 4];
|
u8 p7 = (v & 0x80) ? 0x1C : 0x18;
|
||||||
u16 p2 = SPI_LUT[v & 0x0F];
|
u8 p6 = (v & 0x40) ? 0x1C : 0x18;
|
||||||
buf[0] = p1 >> 4;
|
u8 p5 = (v & 0x20) ? 0x1C : 0x18;
|
||||||
buf[1] = ((p1 & 0x0F) << 4) | (p2 >> 8);
|
u8 p4 = (v & 0x10) ? 0x1C : 0x18;
|
||||||
buf[2] = p2;
|
u8 p3 = (v & 0x08) ? 0x1C : 0x18;
|
||||||
|
u8 p2 = (v & 0x04) ? 0x1C : 0x18;
|
||||||
|
u8 p1 = (v & 0x02) ? 0x1C : 0x18;
|
||||||
|
u8 p0 = (v & 0x01) ? 0x1C : 0x18;
|
||||||
|
|
||||||
|
buf[0] = (p7 << 3) | (p6 >> 2);
|
||||||
|
buf[1] = (p6 << 6) | (p5 << 1) | (p4 >> 4);
|
||||||
|
buf[2] = (p4 << 4) | (p3 >> 1);
|
||||||
|
buf[3] = (p3 << 7) | (p2 << 2) | (p1 >> 3);
|
||||||
|
buf[4] = (p1 << 5) | p0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WS2812_Write24Bit(u8 g, u8 r, u8 b)
|
void WS2812_Write24Bit(u8 g, u8 r, u8 b)
|
||||||
{
|
{
|
||||||
u8 xdata buf[9];
|
u8 xdata buf[15];
|
||||||
u8 m1_save, m0_save;
|
u8 m1_save, m0_save;
|
||||||
|
u8 i;
|
||||||
|
|
||||||
WS2812_EncodeByte(g, &buf[0]);
|
WS2812_EncodeByte5(g, &buf[0]);
|
||||||
WS2812_EncodeByte(r, &buf[3]);
|
WS2812_EncodeByte5(r, &buf[5]);
|
||||||
WS2812_EncodeByte(b, &buf[6]);
|
WS2812_EncodeByte5(b, &buf[10]);
|
||||||
|
|
||||||
EA = 0;
|
EA = 0;
|
||||||
|
|
||||||
@@ -159,17 +164,22 @@ void WS2812_Write24Bit(u8 g, u8 r, u8 b)
|
|||||||
P2M1 |= (1 << 5);
|
P2M1 |= (1 << 5);
|
||||||
P2M0 &= ~(1 << 5);
|
P2M0 &= ~(1 << 5);
|
||||||
|
|
||||||
SPCTL = 0xD1; // Enable SPI at SYSCLK/8 (3.0 MHz)
|
SPCTL = 0xD0; // Enable SPI at SYSCLK/4 (6.0 MHz)
|
||||||
|
SPSTAT = 0xC0; // Clear flags
|
||||||
|
|
||||||
SPSTAT = 0xC0; SPDAT = buf[0]; while (!(SPSTAT & 0x80));
|
SPDAT = buf[0];
|
||||||
SPSTAT = 0xC0; SPDAT = buf[1]; while (!(SPSTAT & 0x80));
|
SPDAT = buf[1];
|
||||||
SPSTAT = 0xC0; SPDAT = buf[2]; while (!(SPSTAT & 0x80));
|
|
||||||
SPSTAT = 0xC0; SPDAT = buf[3]; while (!(SPSTAT & 0x80));
|
for (i = 2; i < 15; i++)
|
||||||
SPSTAT = 0xC0; SPDAT = buf[4]; while (!(SPSTAT & 0x80));
|
{
|
||||||
SPSTAT = 0xC0; SPDAT = buf[5]; while (!(SPSTAT & 0x80));
|
while (!(SPSTAT & 0x80));
|
||||||
SPSTAT = 0xC0; SPDAT = buf[6]; while (!(SPSTAT & 0x80));
|
SPSTAT = 0xC0;
|
||||||
SPSTAT = 0xC0; SPDAT = buf[7]; while (!(SPSTAT & 0x80));
|
SPDAT = buf[i];
|
||||||
SPSTAT = 0xC0; SPDAT = buf[8]; while (!(SPSTAT & 0x80));
|
}
|
||||||
|
while (!(SPSTAT & 0x80));
|
||||||
|
SPSTAT = 0xC0;
|
||||||
|
while (!(SPSTAT & 0x80));
|
||||||
|
SPSTAT = 0xC0;
|
||||||
|
|
||||||
SPCTL = 0x90; // Disable SPI
|
SPCTL = 0x90; // Disable SPI
|
||||||
WS2812_DI = 0;
|
WS2812_DI = 0;
|
||||||
@@ -193,10 +203,6 @@ void WS2812_Reset(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =========================================================================
|
|
||||||
* 延时与时间获取辅助函数 (12T/1T 自适应)
|
|
||||||
* ========================================================================= */
|
|
||||||
|
|
||||||
void Delay_ms(u16 ms)
|
void Delay_ms(u16 ms)
|
||||||
{
|
{
|
||||||
u16 i, j;
|
u16 i, j;
|
||||||
@@ -1044,6 +1050,20 @@ void main(void)
|
|||||||
Uart_SendString("[UART SIM] Ignore: Not in PAIR WAIT state\r\n");
|
Uart_SendString("[UART SIM] Ignore: Not in PAIR WAIT state\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (cmd == 't' || cmd == 'T')
|
||||||
|
{
|
||||||
|
Uart_SendString("[UART SIM] SPI 6MHz Clock Test on P2.5 (SCLK) and P2.3 (MOSI) active. Press reset to exit.\r\n");
|
||||||
|
// Configure SCLK (P2.5) and MOSI (P2.3) as push-pull output
|
||||||
|
P2M1 &= ~((1 << 3) | (1 << 5));
|
||||||
|
P2M0 |= ((1 << 3) | (1 << 5));
|
||||||
|
SPCTL = 0xD0; // SPI Master, 6.0 MHz (SYSCLK / 4)
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
SPSTAT = 0xC0;
|
||||||
|
SPDAT = 0xAA;
|
||||||
|
while (!(SPSTAT & 0x80));
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (cmd == '1')
|
else if (cmd == '1')
|
||||||
{
|
{
|
||||||
current_state = STATE_NORMAL;
|
current_state = STATE_NORMAL;
|
||||||
|
|||||||
Reference in New Issue
Block a user