void led_spi_init(void)
{
gpio_set_die(LED_SPI_IO, 1);
gpio_set_direction(LED_SPI_IO, 0);
gpio_set_pull_up(LED_SPI_IO, 0);
gpio_set_pull_down(LED_SPI_IO, 0);
gpio_write(LED_SPI_IO, 0);

SFR(JL_IOMC->IOMC0, 16, 1, 1);

gpio_set_fun_output_port(LED_SPI_IO, FO_SPI1_DA0, 1, 1, LOW_POWER_FREE);
request_irq(IRQ_SPI1_IDX, 0, led_spi_isr, 0);
os_sem_create(&led_spi_sem, 1);

LED_SPI->BUF = 0;
LED_SPI->CON = 0x4021;
LED_SPI->CON1 = 0;

}

//如果刷新率大于等于20ms可以不修改一下接口
void led_spi_send_rgbbuf(u8 *rgb_buf, u16 led_num) //rgb_buf的大小 至少要等于 led_num * 24
{
if (!led_num) {
return;
}
// while (led_spi_sus) {
// os_time_dly(1);
// }
led_spi_busy = 1;
led_spi_rest();
LED_SPI->BAUD = LED_SPI_CLOCK_BASE / LED_SPI_DAT_BAUD - 1;
LED_SPI->CON |= BIT(14);
LED_SPI->ADR = (u32)rgb_buf;
LED_SPI->CNT = led_num * 24;
while (!(LED_SPI->CON & BIT(15)));
LED_SPI->CON |= BIT(14);
led_spi_busy = 0;
}
void led_spi_send_rgbbuf_isr(u8 *rgb_buf, u16 led_num) //rgb_buf的大小 至少要等于 led_num * 24
{
if (!led_num) {
return;
}
// while (led_spi_sus) {
// os_time_dly(1);
// }
led_spi_busy = 1;
os_sem_pend(&led_spi_sem, 0);
led_spi_rest();
LED_SPI->BAUD = LED_SPI_CLOCK_BASE / LED_SPI_DAT_BAUD - 1;
LED_SPI->CON |= BIT(14);
LED_SPI->ADR = (u32)rgb_buf;
LED_SPI->CNT = led_num * 24;
LED_SPI->CON |= BIT(13);//打开中断
}

更多推荐