1553B通信项目开发笔记(四)bu61580程序编写,实现回环之RT端

        接着之前的文章来写,本篇将实现RT端的编程,用的是片上的1553B0控制器

1、RT配置

	*(volatile INT32U *)(BM1553b0REG + (0x3 << 2)) = 0x0001;              //启动/复位寄存器,D0-复位,D1-BC/MT启动,D2-中断复位,D3-时标复位
	*(volatile INT32U *)(BM1553b0REG + (0x7 << 2)) = 0x8000;              //配置寄存器3#,D15-增强模式使能
	*(volatile INT32U *)(BM1553b0REG + (0x7 << 2)) = 0x8081;              //配置寄存器3#,D0-增强方式码处理中,D3-数据接收器忙无效,D2-RT时标分配失败使能,D4-数据接收器无效非法化,D7-非法化无效, D15-增强模式使能
	*(volatile INT32U *)(BM1553b0REG + (0x0 << 2)) = 0x0001;              //中断屏蔽寄存器,D1-消息结束
	*(volatile INT32U *)(BM1553b0REG + (0x2 << 2)) = 0x9802;              //配置寄存器2#,D0-隔离广播数据,D1-增强RT存储器管理,D11-覆盖非法数据,D12-RT双重缓冲使能,D13-存储器忙位查找表使能,D15-增强模式中断	
	*(volatile INT32U *)(BM1553b0REG + (0x8 << 2)) = 0x2008;              //配置寄存器4#,D3-与配置寄存器#5一起锁存RT地址,D13-忽略忙的模式命令
	*(volatile INT32U *)(BM1553b0REG + (0x9 << 2)) = 0x0902;              //配置寄存器5#,D0-RT地址奇偶校验,D1-RT地址0,D8-间隔检测使能,D11-扩展相交使能
	//这里配置地址有些问题,只能配置到rt1,RT26改不过去,不知道是不是因为硬件电平问题	
	*(volatile INT32U *)(BM1553b0MEM + (0x100 << 2)) = 0x0000;            //堆栈初始化

        首先还是配置寄存器,这里备注比较详细,可以对照61580的芯片手册查阅具体作用

        这里博主遇见一个问题,就是RT的地址只能设置为1,设置到别的地址就无法通信,这个问题后续会解决。暂时拿RT1来进行测试。

	int i; 
	for(i=0;i<4096;i++)
	{
		*(volatile INT32U *)(BM1553b0MEM + (i << 2)) = 0x0;        					      //初始化存储器
	}

        清空存储器区域。

  int i=0,j=0;
	
	for(i=1;i<32;i++)
	{
		*(volatile INT32U *)(BM1553b0MEM + ((0x140+i) << 2)) = 0x400+(i*0x20);     //接收通道地址初始化
		*(volatile INT32U *)(BM1553b0MEM + ((0x160+i) << 2)) = 0x800+(i*0x20);     //发送通道地址初始化
		
		*(volatile INT32U *)(BM1553b0MEM + ((0x1A0+i) << 2)) = 0x4200;             //子地址控制字初始化   ,开启发送和接收EOM中断  
		//0x4200->0100 0010 0000 0000
	}
		
		*(volatile INT32U *)(BM1553b0MEM + (0x120 << 2)) = 0x0000;                 //方式字数据初始化  只有子地址为0x0000才存在方式字的说法

        然后是配置存储器区域,这里补一张RT存储区域定义图

         图上可以看出,从0x140开始是A查询表,这个RT查询表放置是接收/发送/广播数据块的地址。通过查询表里存的地址,就可以找到对应的数据块。PS:这个应该是给BC往RT读写数据用的,BC要知道它下发数据或者取走数据是从什么位置。

  for(i=0;i<8;i++)
	{
		*(volatile INT32U *)(BM1553b0MEM + ((0x240+i) << 2)) = 0x0000;      //忙位设置,初始化为0空闲
	} 

        然后是忙位查询表设置,这个不是很懂,暂时用不到就没关注了。

*(volatile INT32U *)(BM1553b0REG + (0x1 << 2)) = 0x8f80;              //配置寄存器2#,开启RT

        最后是打开RT。

2、RT中断服务程序

	u16 tempVar = 0;
	u16 temp;
	u16 i;

	tempVar = *(volatile INT32U *)((BM1553b0REG+(channel*0x00100000)) + (BUINTSTATUS << 2));             //读中断状态 消息结束中断
	tempVar &= BUEOMINT;           
	if(tempVar==BUEOMINT)                                                							//判断消息结束
	{
		//读当前消息通道是来自A或B 
		tempVar = *(volatile INT32U *)((BM1553b0REG+(channel*0x00100000)) + (BUCFG1 << 2)); 
		bumsgifm->channelAB=(tempVar>>13) & 0x1;
		//读块状态字 这个不太懂是什么  手册上写的是BC/RT命令栈点寄存器				
		bumsgifm->blockStatusWord = *(volatile INT32U *)((BM1553b0REG+(channel*0x00100000)) + (BUCMDSTACKPOINT << 2));    
		//读时标
		bumsgifm->timeTagWord = *(volatile INT32U *)((BM1553b0REG+(channel*0x00100000)) + (BUTIMETAG << 2));    					
		//读RT/MT数据堆栈地址寄存器 数据块指针 这个是翻61580数据手册查到的 BM3610只说了MT 搞不懂
		bumsgifm->dataBlockPointer = *(volatile INT32U *)((BM1553b0REG+(channel*0x00100000)) + (BURTDATASTACKADDR << 2)); 
		//RT最后一个指令寄存器 0dH  接收的命令字+
		bumsgifm->commandWord = *(volatile INT32U *)((BM1553b0REG+(channel*0x00100000)) + (BURTLASTCMD << 2));
		//命令字 15-11 RT地址  10:T/R  9-5:字地址/方式  4-0:数据字计数/方式码
		bumsgifm->remoteTerminalAddr = (bumsgifm->commandWord >> 11) & 0x1f;//RT终端地址
		bumsgifm->tr                 = (bumsgifm->commandWord >> 10) & 0x01;//T/R 
		bumsgifm->subAddModeCode     = (bumsgifm->commandWord >>  5) & 0x1f; //字地址/方式
		bumsgifm->dataCntModeCode    = (bumsgifm->commandWord      ) & 0x1f; //数据字计数/方式码
		printf("BUMSG.commandWord :%#x\n",bumsgifm->commandWord);
		if(bumsgifm->tr == BURX)                                         //判定接下来是接收指令
		{
			memset( bumsgifm->data,BUZERO,BUMSGDATANUM);  
			if(!bumsgifm->dataCntModeCode)
			{
				temp=BUMSGDATANUM;
			}
			else 
			{
				temp=bumsgifm->dataCntModeCode;
			}
			for(i=0;i<temp;i++)
			{
				bumsgifm->data[i] = *(volatile INT32U *)((BM1553b0MEM+(channel*0x00100000)) + ((0x400+i) << 2));
			}
			rev_1553B_CH0=1;              					//启动接收标志,解析函数在主循环执行
		}
	}

        以上是RT中断服务程序,解析了数据帧的命令字和控制字(至于为什么有这两段字可以解析,可以看前一篇BC端设置的文章,还有更前面的1553B协议解析篇),还有就是读取数据。

        这部分程序可以实现BC=>RT的下发,博主目前是跑通了。

3、RT发送数据到BC

        这部分是难点,博主卡在这有半个月最少。

        首先需要着重强调一点,就是RT所有的动作都需要由BC来主控。

        可以理解成:BC对RT有绝对的控制权,除非BC要求RT说话,RT才能说话。

        这个过程很多博文没解释清楚一个问题:BC是怎么知道RT有话要说,才去让RT开口说话呢?

        解释这个问题就需要提到一个东西:矢量字  (奇奇怪怪的名字,但是就是它来实现的)

        

RT 如果主动给BC发送数据?矢量字使用问题?

1553中所有的消息控制都是通过BC端控制的。BC端可以发出BCRT、RTBC、ModeCode、RTRT类型消息。实际应用中经常会出现RT需要主动给BC端上报信息,这种情况下可以通过发送矢量字来实现(Mode Code 16)。

具体流程:

1)        BC端周期性发送 Mode Code 16 消息(发送矢量字),RT端周期的接收矢量字指令。RT端默认发送的矢量字设为0,BC端检测到RT发送的矢量字是0的时候,不做任何操作。

2)        如果RT端需要主动发送数据给BC,RT端先准备好数据,然后将矢量字对应位置位(对应位写1)。

3)        BC端检测到RT端发送过来的矢量字有位为1,BC根据事先约定的对应关系,发送对应的指令(比如RTBC指令)。

4)        RT接到RTBC指令后,发送数据给BC,数据发送消息结束后,RT端将矢量字对应位清0。

5)        如果RT有新的数据要发送给BC,重复2)到4)。

矢量字对应位和RT 子地址常用的对应关系如下表所示。

表 矢量字对应位和RT子地址常用对应关系表

SA1对应矢量字第0位

如果BC端检测到矢量字第0位置1,发送对应SA1的RTBC指令

SA2对应矢量字第1位

如果BC端检测到矢量字第1位置1,发送对应SA2的RTBC指令

SA3对应矢量字第2位

如果BC端检测到矢量字第2位置1,发送对应SA3的RTBC指令

SA4对应矢量字第3位

-----------------

SA5对应矢量字第4位

-----------------

SA6对应矢量字第5位

-----------------

SA7对应矢量字第6位

-----------------

SA8对应矢量字第7位

-----------------

SA9对应矢量字第8位

-----------------

SA10对应矢量字第9位

-----------------

SA11对应矢量字第10位

-----------------

SA12对应矢量字第11位

-----------------

SA13对应矢量字第12位

-----------------

SA14对应矢量字第13位

-----------------

SA15对应矢量字第14位

如果BC端检测到矢量字第14位置1,发送对应SA15的RTBC指令

SA16对应矢量字第15位

如果BC端检测到矢量字第15位置1,发送对应SA16的RTBC指令

注:上表只是一般常用的对应的关系,用户应根据实际需要使用矢量字功能。矢量字和RT SA对应关系是BC端和RT端通信之前双方约定好的,不限于RTBC指令。

         引用一段某公司的矢量字应用答疑。

        个人理解这个矢量字:BC会不断以某个间隔去问RT你有没有需要说的,他们之前提前规定了N种说话类型,RT会在需要说话的时候提前把要说话的类型提前反馈给BC(状态字),就是上引用里提到的SA0-SA30。

        矢量字就是包含在状态字里,这个概念也很重要。实际上1553通信由这几种字来实现:控制、命令、数据、状态。(这里怎么玩的,可以去翻看前面的协议介绍篇)

       

        这个过程里,第一个命令字是BC给的,然后RT回一个状态字,这个过程是以某个间隔不断进行的。 状态字给到BC后,RT就会开始发送数据字。

        最后一个问题,RT端怎么把需要发送的数据给到BC?这个过程实际上是RT端将数据存到RT端的存储器区域,然后协议芯片会在前面两步骤完成之后,将这部分数据拼凑成数据字发送出去。

        所以,对于编程来说,只需要找到放数据的存储器区域即可,提前写进去然后修改矢量字即可(SA1)。

        这里不得不提到博主任务书里的RT26-SA30-32→BC这个RT发送数据到BC的过程描述,之前一直没搞明白为什么有个SA30,还有个32。后面博主知道32是代表的子地址32,但是SA30是真的没明白,又没办法直接和甲方交流。这里搞明白了,是RT地址26在置位SA30后,往32子地址里写入数据,就可以发送到BC。PS:这里的32和SA30都说相对于BC来说的。

        暂时写到这里,博主的RT上传部分程序编写又卡住了,矢量字有一个对应关系,这个SA30怎么设置呢?

        

  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: bu61580 开发版是一种基于华大公司的芯片 bu61580开发板。bu61580 芯片是一款低功耗蓝牙解决方案,可用于各种物联网应用。该开发版相当于一个开发者使用的工具,用于帮助开发人员快速、便捷地进行蓝牙应用的开发和调试。 bu61580 开发版提供了丰富的硬件接口和软件支持,包括传感器接口、GPIO 引脚、UART 接口等。开发者可以利用这些接口与外部设备进行通信实现不同的功能,如数据采集、通信、控制等。 在软件方面,bu61580 开发版提供了一套完整的开发工具链,包括编译器、调试器、示例代码等。开发者可以通过这些工具进行蓝牙应用的开发和调试,快速验证自己的想法和实现自己的功能。 bu61580 开发版还提供了丰富的文档和技术支持,开发者可以通过阅读文档和查阅技术资料,了解芯片的特性和使用方法,从而更好地进行开发工作。 总之,bu61580 开发版是一款功能强大的蓝牙开发工具,可以帮助开发者快速、高效地进行蓝牙应用的开发和调试,推动物联网技术的发展。 ### 回答2: bu61580是一款开发版的芯片,主要应用于电子产品的设计和开发工作中。该芯片具有高性能和低功耗的特点,适用于物联网、智能家居、工业控制等领域。 bu61580开发版提供了丰富的外设接口,包括多个串口、GPIO口、SPI、I2C等,方便用户进行外围设备的连接和数据交互。同时,它还支持多种通信方式,如蓝牙、Wi-Fi、Ethernet等,用户可以根据自己的需求选择适合的通信方式。 bu61580开发版还提供了完善的开发工具和软件支持,包括开发板原理图、参考设计、开发文档等,帮助开发人员快速上手和进行开发工作。开发者可以利用这些资源,快速开发出符合自己需求的产品。 此外,bu61580开发版还具有良好的软硬件兼容性,可以与其他模块和平台进行无缝对接,方便用户进行二次开发和定制。开发者可以根据自己的项目需求,选择合适的软件平台和开发工具,进行个性化开发。 总之,bu61580开发版是一款功能强大、易于开发的芯片,适合各种电子产品的设计和开发工作。它的高性能、低功耗以及丰富的外设接口和通信方式,能够满足用户的不同需求,帮助开发者快速实现产品的概念设计和样机制作。 ### 回答3: bu61580开发版是一款基于BU61580芯片的开发板。BU61580芯片是一款低功耗、高性能的微控制器芯片,广泛应用于物联网和嵌入式系统开发中。开发版除了搭载了BU61580芯片外,还配备了丰富的外设和接口,方便开发者进行项目开发和调试。 开发版上主要包括以下部分: 1. BU61580芯片:该芯片采用了先进的制造工艺,具有低功耗和高性能的特点。它可以实现多种通信协议,如SPI、I2C等,支持多种传感器接口,并具备丰富的存储和计算能力。 2. 外设接口:开发版上通常配备了丰富的外设接口,如GPIO、ADC、PWM等,方便开发者进行外设的连接和扩展。通过这些接口,开发者可以连接各种传感器、执行器和显示器等外设,实现更多的功能。 3. 调试接口:开发版通常还包含调试接口,如串口、JTAG等,方便开发者进行程序调试和下载。通过调试接口,开发者可以实时查看和修改程序运行状态,方便排除问题和优化代码。 4. 开发工具:针对BU61580芯片开发开发工具通常会提供给开发者,包括编译器、调试工具等。这些工具可以帮助开发者进行程序编写、调试和下载等操作,提高开发效率。 总之,BU61580开发版是一款方便开发者进行物联网和嵌入式系统开发的工具。它提供了丰富的硬件接口和开发工具,可以帮助开发者快速开发出高性能、低功耗的应用。如果有需要,开发者可以通过开发版上的接口进行硬件和软件的扩展,满足更多的应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值