利用硬件SPI控制TX1818灯珠
目录
TX1818CE 是一个集控制电路与发光电路于一体的智能外控LED 光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,电源稳压电路,内置恒流电路,高精度RC 振荡器,输出驱动采用专利PWM 技术,有效保证了像素点内光的颜色高一致性。
数据协议采用单极性归零码的通讯方式,像素点在上电复位以后,DIN 端接受从控制器传输过来的数据,首先送过来的24bit 数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO 端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。
LED 具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。将控制电路集成于LED 上面,电路变得更加简单,体积小,安装更加简便。
- 采用高压功率CMOS 工艺;
- 默认8mA 恒流输出,便于降低内置灯珠功耗;
- 灰度调节电路(256 级灰度可调);
- 单线串行级联接口(DIN,DO);
- 内置高精度和高稳定性振荡器;
- 数据整形:接受完本单元数据自动将后续数据整形输出;
- 数据传输频率可达800Kbps。
-
-
- 0/1码时间间隔
-
T符号 | 码元Code | 最小值 | 典型值 | 最大值 | 单位 |
T0H | 0码,高电平时间 | 200 | 300 | 400 | ns |
T0L | 0码,低电平时间 | 800 | 900 | -- | ns |
T1H | 1码,高电平时间 | 650 | 900 | 1000 | ns |
T1L | 1码,低电平时间 | 200 | 300 | -- | ns |
Trst | Reset码,低电平时间 | ≥200 | μs |
- 发送1码的伪码为:
static void set_led_1(void)//发出二进制1
{
set_led_hight();
ndelay(900);
set_led_low();
ndelay(300);
}
- 发送0码的伪码为:
static void set_led_0(void)//发出二进制0
{
set_led_hight();
ndelay(300);
set_led_low();
ndelay(900);
}
- 发送复位码的伪码为:
static void reset_op(void)//发出Reset信号
{
set_led_hight();//首先将总线拉高ndelay
ndelay(300);//保持一段时间
set_led_low();//拉低
udelay(80);//至少保持50us,之后芯片等待接收新的数据
}
例如:输出是红灯需要发送的数据为0XFF0000
- 转换为2进制:111111110000000000000000
- 转换为函数伪码:
set_led_1
set_led_1
set_led_1
set_led_1
set_led_1
set_led_1
set_led_1
set_led_1
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
set_led_0
reset_op
- 转换为波形
未实验
使用SPI信号的MOSI管脚当作TX1818CE的DIN数据脚
Code-0码的耗时:300+900=1200ns=1.2us
Code-1码的耗时:600+300=1200ns=1.2us
SPI 频率设计:
SPI发送可以设置8位或是16位数据。
SPI以8位为例,用8位数据代表一个码值,8位的时间总和,等于1.2us;
每一位SPI数据耗时为:1.2us / 8=0.15u
公式:频率 = 周期的倒数
频率 = 1 / 0.15u
频率 = 6.666666M
SPI设置6.6M就可以了
- 数据转换
SPI数据1代表输出150ns的高电平
SPI数据0代表输出150ns的低电平
Code-0码=300ns高+900ns低=150*2+150*6=11000000=0XC0
Code-1码=900ns高+300ns低=150*6+150*2=11111100=0XFC
码值 | 高低电压 | SPI二进制数据 | SPI16进制数据 |
Code-0码 | 300ns高,900ns低 | 11000000 | 0XC0 |
Code-1码 | 900ns高,300ns低 | 11111100 | 0XFC |
- RGB数据转换为SPI数据
static int rgb2spi(u8 *dst, u8 *org,int cnt)
{
int i,j;
int color=0;
int index=0;
if(NULL==org|| NULL==dst)
return index;
//数据组成为RGB/RGB/RGB...
for(i=0; i<cnt; i++)
{
color=org[i];//获取一个颜色值
for (j = 0; j < 8; j++)
{
index=i*8+j;
if (1 & color)//每一个bit转换为SPI的一个byte
dst[index]=SPI_LED_CODE1;
else
dst[index]=SPI_LED_CODE0;
color =color >> 1;
}
}
return index+1;
}
- RST码转换
static int addrst(u8 *dst, int index)
{
int i=0;
if( NULL== dst)
return index;
dst[index++]=SPI_LED_RESET;
dst[index++]=0x00;
dst[index++]=0x00;
dst[index++]=0x00;
for(i=index;i<(index/64+1)*64;i++)
dst[i]=0x00;
return i;
}
- 对其他模块无影响。
- 一组SPI(4个管脚)无法它用。
- 只能使用SPI1和SPI2(目前的验证结果)。
- 只能使用DMA的方式,非DMA方式会出现无法控制多个灯的情况。
- SPI的MOSI和灯带的数据线之间要有缓冲器。否则会击穿CPU的IO脚。