/**
*************************************************************************
*@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);
}
}
/**************************************************************************/
ambe1000在stm32下的串行驱动
最新推荐文章于 2022-10-30 16:58:15 发布