如果你用的是NXP的ARM7,如果你正在做DMX512协议,那么你有福了【恢复】
DMX512 communication using the LPC2000 ourdev_598464.zip(文件大小:783K) (原文件名:an10717.zip) NXP官方提供的范例,包括DMX512协议介绍,上位机下位机电路图和全套的程序 谢谢!! 最近正为这个烦恼呢!谢谢LZ!~~~~ 请教关于DMX512接收的程序里
__irq void U1_Isr(void)
{
static intiid;
while (((iid = U1IIR) & 1) == 0)
{
if ((iid & 0x0E) == 6) // Receive Line Status
{
U1LSR; // read LSR to clear the interrupt
U1RBR;
rxin = 0;
}
else // Receive Data Available
{
do
{
DMX_buf = U1RBR;
if (rxin < 513)
rxin ++;
} while (U1LSR & 1); // receive data ready
}
}
VICVectAddr = 0; // Acknowledge Interrupt
}
其中// Receive Line Status处理那一段是干什么的,另外 Receive Line Status中断表示具体单片机什么状态,谢谢各位啦 Receive Line Status
是arm7单片机内部的一个寄存器:U1IIR mark 这个答案有点简单了,呵呵
换句话问,单片机在什么情况下产生Receive Line Status中断的呢?与Receive Data Available中断的区别是什么? 因为这个事情是要你自己查芯片数据手册的……
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_491421.jpg
(原文件名:lpc.jpg) 谢谢,刚才没有看到,现在找到了
只要Rx的输入产生4个错误条件(溢出错误-OE、奇偶错误-PE、帧错误-FE和间隔中断-BI)中的任意一个,将置位011即接收线状态标识。
另外我只找到英文手册,不知道能不能传上来一个中文的 这个NXP的文档及程序中遵守的DMX512协议中,怎么没有对发送或接收的数据进行每一帧的第10bit进行处理啊??我看DMX512协议说第10bit用来区分这帧数是起始代码或命令的,难道我看到的协议是错的??有谁有DMX512标准的协议,
网上找的协议分为三类
1.资料发送基于一种8位异步串行协议,带一个开始位(低电平)和两个停止位(高电平),没有奇偶校验;主控器发送一次为513帧,包括1帧启动代码+512帧数据。其中512帧数据代表512个设备的命令。数据格式为
起始帧--设备1命令帧--设备2命令帧--..设备512命令帧
2.第1位是起始位0,低电平有效;第2-9位是数据位,低位在前,高位在后高电平为1,低电平为0;第10位是信号位,为0表示此帧是复位信号,为1表示此帧是数据信号;第11位是停止位,高电平有效。在进行正常数据传输之前,发送1帧复位信号,其数据为0,第10位为0,声明数据传输开始。随后进阶若干数据块,每个数据块的第一帧数据称为起始帧,第10位为1,起始帧后续数据表示对此接收设备的命令帧,第10位为1。设备总数最多512个。数据格式为
复位帧--数据块1(起始帧+m帧数据)--数据块2(起始帧+m帧数据)--...数据块n(起始帧+m帧数据)
3.第1位是起始位0,低电平有效;第2-9位是数据位,低位在前,高位在后高电平为1,低电平为0;第10位是信号位,为0表示此帧是复位信号,为1表示此帧是数据信号;第11位是停止位,高电平有效。主控器发送一次为513帧,包括1帧启动代码+512帧数据。其中512帧数据代表512个设备的命令。数据格式为
起始帧--设备1命令帧--设备2命令帧--..设备512命令帧
不知道这三种哪种才是标准的!!如果是2,则m与n各是怎么计算?! 正好学习 Mark QQ:1191474325
提供DMX512产品方面的技术支持 mark mark mark mark mark 绝对的好东西呀~~~~~~~~~ mark 留待以后研究,谢谢! DX512 DMX512 mark mark mark mark 顶一下! 回复【28楼】cunlingwang 爱飞的小兵
-----------------------------------------------------------------------
是啊,怎么没有看出来对第九位的判定了 顶顶,收藏 T0TC= 0; // reset Timer counter
T0IR= 0x01; // reset interrupt flag
T0MR0 = 92; // set match to 92 us
U1LCR = 0x47; // 'break'
T0TCR = 1; // start timer 0
while ((T0IR & 0x01) == 0); // wait for timer match
T0TC= 0; // reset Timer counter
T0IR= 0x01; // reset interrupt flag
T0MR0 = 12; // set match to 12 us
U1LCR = 7; // 'mark'
T0TCR = 1; // start timer 0
while ((T0IR & 0x01) == 0); // wait for timer match
没有用过用过Lpc的,对于break和mark的电平控制时怎么确定的?
U1LCR = 0x47; // 'break'
上面是让TX发送低电平?
U1LCR = 7; // 'mark'
上面是让TX发送高电平?
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_668806ZD1RLU.png
(原文件名:搜狗截图_2011-08-18_14-20-17.png) mark. very good !!! 真的有福啦,O(∩_∩)O哈哈~
very good !!! 我们用的就是这个,弄下来参考参考 可以进www.lpcware.com找 谢谢分享。 参考参考,谢谢楼主分享!
页:
[1]