Skip to content

Commit

Permalink
ports/psoc6: Support for WS2812B 400KHz.
Browse files Browse the repository at this point in the history
Signed-off-by: IFX-Anusha <[email protected]>
  • Loading branch information
IFX-Anusha committed Aug 21, 2024
1 parent 8db29a0 commit 93d3b04
Showing 1 changed file with 56 additions and 4 deletions.
60 changes: 56 additions & 4 deletions ports/psoc6/machine_bitstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@
#if MICROPY_PY_MACHINE_BITSTREAM

const uint32_t timing_sequence_1[] = {500, 1125, 800, 750};
const uint32_t timing_sequence_2[] = {400, 850, 800, 450}; // WS2812B
const uint32_t timing_sequence_2[] = {400, 850, 800, 450}; // WS2812B 800kHz
const uint32_t timing_sequence_3[] = {300, 900, 600, 600}; // SK6812
const uint32_t timing_sequence_4[] = {800, 1700, 1600, 900}; // WS2812B 400kHz

uint32_t range = 0;

Expand All @@ -45,20 +46,25 @@ void machine_bitstream_high_low(mp_hal_pin_obj_t pin, uint32_t *timing_ns, const
GPIO_PRT_Type *base = CYHAL_GET_PORTADDR(pin);
uint32_t pinNum = CYHAL_GET_PIN(pin);
uint32_t fcpu_mhz = mp_hal_get_cpu_freq() / 1000000;
if (fcpu_mhz != 100) {
mp_raise_ValueError(MP_ERROR_TEXT("Only 100 MHz is supported"));
}

if (memcmp(timing_ns, timing_sequence_1, 4 * sizeof(uint32_t)) == 0) {
range = 0;
} else if (memcmp(timing_ns, timing_sequence_2, 4 * sizeof(uint32_t)) == 0) {
range = 1;
} else if (memcmp(timing_ns, timing_sequence_3, 4 * sizeof(uint32_t)) == 0) {
range = 2;
} else if (memcmp(timing_ns, timing_sequence_4, 4 * sizeof(uint32_t)) == 0) {
range = 3;
} else {
for (size_t i = 0; i < 4; ++i) {
if ((timing_ns[i]) <= 150) {
mp_raise_ValueError(MP_ERROR_TEXT("Timing is not supported"));
if ((timing_ns[i]) <= 1500) {
mp_raise_ValueError(MP_ERROR_TEXT("Given timing is not supported. Use the defined timings if timing is below 1500 ns"));
}
}
range = 3;
range = 4;
}

// Convert ns to cycles [high_time_0, low_time_0, high_time_1, low_time_1].
Expand Down Expand Up @@ -180,6 +186,52 @@ void machine_bitstream_high_low(mp_hal_pin_obj_t pin, uint32_t *timing_ns, const
}
}

case 3:
for (size_t i = 0; i < len; i++)
{

uint8_t b = buf[i];
// Send each bit of the byte
for (size_t j = 0; j < 8; j++)
{
bool bit = (b & 0x80) != 0;
b <<= 1;
switch (bit)
{
// Send a 1-bit
case 1:
// sendOneBit();
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
break;
// Send a 0-bit
case 0:
// sendZeroBit();
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 1);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
Cy_GPIO_Write(base, pinNum, 0);
break;
}
}
}

break;
default:
for (size_t i = 0; i < len; ++i) {
Expand Down

0 comments on commit 93d3b04

Please sign in to comment.