- 协议详解
来源:DMX512是由USITT(美国剧院技术协会)提出的,是一种标准数字接口控制调光器的方式,协议多用于舞台、景观灯的控制,全称为USITT DMX512-A。
硬件依托:基于rs485硬件接口,波特率为250kbps =250000bps,是主从式的异步串行传输协议,即一个主机向多个从机发送11位的数据帧,从机只接收和判断收到的数据帧是否丢弃还是使用。
数据格式:波特率25000bps对应每bit的持续时间是4us,发送一个数据帧的时间:4*11=44us。一个完整的DMX512数据包组成:BREAK信号、MAB信号和SC(start code)信号,以及512个数据帧;一个数据帧组成:1bit低电平起始位、8bit数据位(0-255)、2bit停止位。
信号位说明:BREAK是一个DMX512数据包的启示控制信号,代表一个数据包发送完的复位标志,BREAK的信号是低电平有效,持续时间88us-1S,典型值100us。MAB信号代表一个数据包开始发送,因为BREAK和START CODE的起始位都是低电平,故加入MAB来区分,所以MAB是高电平,持续时间8us-1s,通常取12us。START CODE是起始码,和普通的数据帧一样,数据位为0x0
- 代码设计
DMX512协议发送设计:DMX512的数据帧格式和串口的格式差不多,可以基于串口来发送数据帧,要求是把串口的数据位设为9位(多了一位停止位)。512个数据帧解决了后,主要就是要形成BREAK和MAB,这里用的定时器做的us延时来实现。
步骤1:初始化一个485串口,波特率设置为250000bps、9bit数据位、一位停止位、tx模式。
步骤2:初始化定时器,参考网上教程写us延时函数。
步骤3:实现UART_MODE(int mode)函数,该函数是将uart的tx脚进行IO口初始化的,发送BREAK和MAB的时候要把tx脚初始化为上拉输出,发送数据帧时要把tx设置为复用推挽输出。
示例代码:
Int pDMX_buf;
UART_MODE(io模式);
GPIOC->BRR = GPIO_PIN_TX; //把tx脚输出低电平的BREAK位
Delay_us(100);
GPIOC->BSRR = GPIO_PIN_TX; //把tx脚输出高电平的MAB位
Delay_us(12);
UART_MODE(uart模式);
for(pDMX_buf = 0; pDMX_buf <= 512; pDMX_buf++) //0:startcode 1-512:调光数据
{
if(pDMX_buf == 0)
{
UART4->DR = 0x00; //第一帧数据0x00
while((UART4->SR & 0X40) == 0); //确保数据发送完成
}
else
{
UART4->DR = 0x100 | dmx_buf[pDMX_buf];//数据帧的第九位要为高
while((UART4->SR & 0X40) == 0); //确保数据发送完成
}
}