ambe1000在stm32下的串行驱动

/**
*************************************************************************
*@brief
*@author   rundream@gmail.com
*@param
*@param
*@return
*************************************************************************
*/

#include ".\\common.h"
#include ".\\Ambe1000.h"

void AmbeGpioConfig(void){
	GPIO_InitTypeDef GPIO_InitStructure;
		/* Configure PA356 as output */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
		/* Configure PA4 as input */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//SISTRB PE10(out)
	//SICK PE9(out)
	//SDI PE8(out)
	//DPE PE7(in)
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
			/* Configure PE7 as input */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
}

void Delay(INT32U Ticks){
	INT32U i=0,j;
	for(i=0;i<Ticks;i++){
		for(j=0;j<0x10;j++){__NOP;};
	};
}
/*
		while(!EPR);//encoder packet ready
		AMBEReadSerial();//这里是从ambe读ambe的编码数据,接收到的数据存入了pFrameData
		if(bTxOver) LoadTXBUF();//将上面接受到的数据组侦,装载到pTXBUF
*/

//SOSTRB 下降沿之后,第一个SOCK上升沿锁存数据到AMBE1000的SDO管脚
//AT89C52 22.1184Mhz验证
//PRD_SOSTRB
//PS2_SOCK
//PS1_SDO
//INT32U nI=0;

INT8U pFrameData[192]={0};

void AMBEReadSerial(void)
{
	INT8U nI, nK ,nTemp;
	INT8U *pDes;
	pDes = pFrameData;

	for(nI = 0; nI < 17; nI ++){
			SOSTRB_L();
			SOCK_L();
			nTemp = 0;
			for(nK = 0; nK < 8; nK ++){
				SOCK_H();//上升沿,ambe1000在准备数据
				Delay(1);
				SOCK_L();//下降沿锁存数据
				if(GET_SDO() == 1)Bit_Set(nTemp,7-nK);
				Delay(1);
			}
			* pDes++ = nTemp;
			SOSTRB_H();
			nTemp = 0;
			for(nK = 0; nK < 8; nK ++){
				SOCK_H();//上升沿,ambe1000在准备数据
				Delay(1);
				SOCK_L();//下降沿锁存数据
				if(GET_SDO() == 1)Bit_Set(nTemp,7-nK);
				Delay(1);
			}
			* pDes++ = nTemp;
		  Delay(3);
	}
}


//SISTRB 下降沿之后,第二个SICK上升沿锁存SDI管脚的数据到AMBE1000内部
//AT89C52 22.1184Mhz验证

// #define SISTRB_H() GPIO_SetBits(GPIOE,GPIO_Pin_10)// PE10(out)
// #define SISTRB_L() GPIO_ResetBits(GPIOE,GPIO_Pin_10)// PE10(out)

// #define SICK_H() GPIO_SetBits(GPIOE,GPIO_Pin_9)PE9(out)
// #define SICK_L() GPIO_ResBits(GPIOE,GPIO_Pin_9)PE9(out)

// #define SDI_H() GPIO_SetBits(GPIOE,GPIO_Pin_8) //PE8(out)
// #define SDI_L() GPIO_ResetBits(GPIOE,GPIO_Pin_8) 

// #define GET_DPE() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7)//PE7(in)


void AMBEWriteSerial(void)
{
	INT8U nI, nK ,nTemp;
	INT8U *pSrc;
	pSrc = pFrameData;

	for(nI = 0; nI < 17; nI++)//这里下面发送了17 word 34INT8Us
 	{
		SISTRB_L();
		SICK_L();
		Delay(1);
		SICK_H();
		nTemp = *pSrc++;
		for(nK = 0; nK <=7; nK++)
		{
			SICK_L();
			Delay(1);
			if(Sfr_Bit_Test_True(nTemp ,7-nK)){
				SDI_H();
			}else{SDI_L();}
			Delay(1);
			SICK_H();
			Delay(1);
		}
		SISTRB_H();
		SICK_L();
		nTemp = *pSrc++;
		for(nK = 0; nK <=7; nK++)
		{
			SICK_L();
			Delay(1);
			if(Sfr_Bit_Test_True(nTemp ,7-nK)){
				SDI_H();
			}else{SDI_L();}
			Delay(1);
			SICK_H();
			Delay(1);
		}
		SICK_L();
	//	Delay15uS();
		Delay(3);
	}	
}
/*
如何设置 AMBE-1000 工作在串行被动有帧方式? 
将  AMBE-1000  芯片的引脚  CH_SEL2(pin98)接低电平,CH_SEL1
(pin99)、CH_SEL0(pin2)均接高电平,AMBE-1000 即工作在串行被动有
帧工作方式。注意:芯片的 CHP_D2(pin58)是串行方式的端口使能引脚,
必须接低电平。 
*/
void AMBEReadSerialUnFrame(int DataLen)
{
	INT8U nI, nK ,nTemp;
	INT8U *pDes;
	pDes = pFrameData;
	if((DataLen<12)||(DataLen>192)){return;};


	for(nI = 0; nI < DataLen; nI ++){	

		SOSTRB_H();		
//		SOSTRB_L();
		SOCK_L();
		Delay(1);
		SOCK_H();
		Delay(1);
		SOSTRB_L();
		Delay(1);
		SOCK_L();
		Delay(1);
		SOCK_H();
		Delay(1);
		SOSTRB_H();
		
			nTemp = 0;
			for(nK = 0; nK < 8; nK ++){
				SOCK_H();//
				if(GET_SDO() == 1)Bit_Set(nTemp,7-nK);
				Delay(1);
				SOCK_L();//
				Delay(1);
			}
			* pDes++ = nTemp;
			nTemp = 0;
			for(nK = 0; nK < 8; nK ++){
				SOCK_H();//
				if(GET_SDO() == 1)Bit_Set(nTemp,7-nK);
				Delay(1);				
				SOCK_L();//			
				Delay(1);
			}
			SOCK_L();
			* pDes++ = nTemp;
		  Delay(100);
	}
}
void AMBEWriteSerialUnFrame(int DataLen)
{
	INT8U nI, nK ,nTemp;
	INT8U *pSrc;
	pSrc = pFrameData;
	if((DataLen<12)||(DataLen>192)){return;};
	for(nI = 0; nI < DataLen; nI++)//这里下面发送了17 word 34INT8Us
 	{
		SISTRB_H();
		SICK_L();
		Delay(1);
		SICK_H();
		Delay(1);
		SISTRB_L();
		SICK_L();
		Delay(1);
		SICK_H();
		Delay(1);
		SISTRB_L();
		Delay(1);
		SICK_L();
		Delay(1);
		
		
		nTemp = *pSrc++;
		for(nK = 0; nK <=7; nK++)
		{
			SICK_L();
			Delay(1);
			if(Sfr_Bit_Test_True(nTemp ,7-nK)){
				SDI_H();
			}else{SDI_L();}
			Delay(1);
			SICK_H();
			Delay(1);
		}
//		SISTRB_H();
		SICK_L();
		nTemp = *pSrc++;
		for(nK = 0; nK <=7; nK++)
		{
			SICK_L();
			Delay(1);
			if(Sfr_Bit_Test_True(nTemp ,7-nK)){
				SDI_H();
			}else{SDI_L();}
			Delay(1);
			SICK_H();
			Delay(1);
		}
		SICK_L();
	//	Delay15uS();
		Delay(3);
	}	
}
/**************************************************************************/



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值