/****************************************************
Projekt: TMC26x
Modul: TMC26x-Commands.c
Kommandointerpreter
Datum: 23.4.2009 OK
*****************************************************/
#include "at91sam7x256.h"
#include "bits.h"
#include <stdlib.h>
#include <string.h>
#include "TMC26x.h"
#include "TMC26x-Commands.h"
#include "UART-TMC26x.h"
#include "USB-TMC26x.h"
#include "SPI-TMC26x.h"
#include "TMC262-ARM.h"
#include "StepDirIrq-TMC26x.h"
#include "Systimer-TMC26x.h"
//Die Adressen sind hier fest eingestellt
#define SERIAL_HOST_ADDRESS 2
#define SERIAL_MODULE_ADDRESS 1
//Globale Variablen
static UCHAR TMCLCommandState;
TTMCLCommand ActualCommand;
TTMCLReply ActualReply;
UCHAR TMCLReplyFormat;
UCHAR SpecialReply[9];
static UCHAR UARTCmd[9];
static UCHAR UARTCount;
static UCHAR ResetRequested;
//Importierte Variablen
extern const char *VersionString;
extern volatile int ActualVelocity;
extern volatile int ActualAcceleration;
extern volatile int ActualPosition;
extern volatile int TargetVelocity;
extern volatile int TargetPosition;
extern volatile int MaxPositioningSpeed;
extern volatile UCHAR RampMode;
extern volatile UCHAR TargetReachedFlag;
//Prototypen f黵 die TMCL-Funktionen
static void RotateRight(void);
static void RotateLeft(void);
static void MotorStop(void);
static void MoveToPosition(void);
static void SetAxisParameter(void);
static void GetAxisParameter(void);
static void UserFunc0(void);
static void UserFunc1(void);
static void UserFunc7(void);
static void GetVersion(void);
static void SoftwareReset(void);
/*******************************************************************
Funktion: ResetCPU
Parameter: ResetPeripherals: Gibt an, ob nur die eigentliche CPU
oder auch die On-Chip-Peripherie zur點kgesetzt werden
soll (TRUE = auch Peripherie, FALSE = nur Core).
R點kgabewert: ---
Zweck: Reset der CPU mit oder ohne der integrierten Peripherie.
********************************************************************/
void ResetCPU(UCHAR ResetPeripherals)
{
if(ResetPeripherals)
AT91C_BASE_RSTC->RSTC_RCR=AT91C_RSTC_PROCRST|AT91C_RSTC_PERRST|(0xA5<<24);
else
AT91C_BASE_RSTC->RSTC_RCR=AT91C_RSTC_PROCRST|(0xA5<<24);
}
void ShortDelay(void)
{
UINT t1;
t1=GetSysTimer();
while(abs(t1-GetSysTimer())<2);
}
/*******************************************************************
Funktion: ExecuteActualCommand()
Parameter: ---
R點kgabewert: ---
Zweck: Ausf黨ren des Befehls, der in der globalen Variablen
ActualCommand steht.
********************************************************************/
void ExecuteActualCommand(void)
{
//Antworttelegramm vorbelegen
ActualReply.Opcode=ActualCommand.Opcode;
ActualReply.Status=REPLY_OK;
ActualReply.Value.Int32=ActualCommand.Value.Int32;
//Befehl ausf黨ren
switch(ActualCommand.Opcode)
{
case TMCL_ROR:
RotateRight();
break;
case TMCL_ROL:
RotateLeft();
break;
case TMCL_MST:
MotorStop();
break;
case TMCL_MVP:
MoveToPosition();
break;
case TMCL_SAP:
SetAxisParameter();
break;
case TMCL_GAP:
GetAxisParameter();
break;
case TMCL_UF0:
UserFunc0();
break;
case TMCL_UF1:
UserFunc1();
break;
case TMCL_UF7:
UserFunc7();
break;
case TMCL_GetVersion:
GetVersion();
break;
case TMCL_SoftwareReset:
SoftwareReset();
break;
default:
ActualReply.Status=REPLY_INVALID_CMD;
break;
}
}
/*******************************************************************
Funktion: ProcessCommands()
Parameter: ---
R點kgabewert: ---
Zweck: Holen und Ausf黨ren von Befehlen 黚er RS232 und USB.
Diese Funktion mu� periodisch aus der Hauptschleife
heraus aufgerufen werden.
Es werden 9-Byte-Kommandos 鋒nlich wie bei TMCL verwendet.
********************************************************************/
void ProcessCommands(void)
{
UCHAR Byte;
UCHAR Checksum;
UINT i;
UCHAR USBCmd[9];
UCHAR USBReply[9];
//**Antwort auf letzten Direktmodus-Befehl senden (wenn vorhanden)**
if(TMCLCommandState==TCS_UART) //Antwort 黚er UART
{
if(TMCLReplyFormat==RF_STANDARD)
{
Checksum=SERIAL_HOST_ADDRESS+SERIAL_MODULE_ADDRESS+
ActualReply.Status+ActualReply.Opcode+
ActualReply.Value.Byte[3]+
ActualReply.Value.Byte[2]+
ActualReply.Value.Byte[1]+
ActualReply.Value.Byte[0];
WriteUART(SERIAL_HOST_ADDRESS);
WriteUART(SERIAL_MODULE_ADDRESS);
WriteUART(ActualReply.Status);
WriteUART(ActualReply.Opcode);
WriteUART(ActualReply.Value.Byte[3]);
WriteUART(ActualReply.Value.Byte[2]);
WriteUART(ActualReply.Value.Byte[1]);
WriteUART(ActualReply.Value.Byte[0]);
WriteUART(Checksum);
}
else if(TMCLReplyFormat==RF_SPECIAL)
{
for(i=0; i<9; i++)
{
WriteUART(SpecialReply[i]);
}
}
}
else if(TMCLCommandState==TCS_UART_ERROR) //letztes Kommando 黚er UART hatte falsche Pr黤summe
{
ActualReply.Opcode=0;
ActualReply.Status=REPLY_CHKERR;
ActualReply.Value.Int32=0;
Checksum=SERIAL_HOST_ADDRESS+SERIAL_MODULE_ADDRESS+
ActualReply.Status+ActualReply.Opcode+
ActualReply.Value.Byte[3]+
ActualReply.Value.Byte[2]+
ActualReply.Value.Byte[1]+
ActualReply.Value.Byte[0];
WriteUART(SERIAL_HOST_ADDRESS);
WriteUART(SERIAL_MODULE_ADDRESS);
WriteUART(ActualReply.Status);
WriteUART(ActualReply.Opcode);
WriteUART(ActualReply.Value.Byte[3]);
WriteUART(ActualReply.Value.Byte[2]);
WriteUART(ActualReply.Value.Byte[1]);
WriteUART(ActualReply.Value.Byte[0]);
WriteUART(Checksum);
}
else if(TMCLCommandState==TCS_USB) //Antwort 黚er USB
{
ShortDelay();
if(TMCLReplyFormat==RF_STANDARD)
{
Checksum=SERIAL_HOST_ADDRESS+SERIAL_MODULE_ADDRESS+
ActualReply.Status+ActualReply.Opcode+
ActualReply.Value.Byte[3]+
ActualReply.Value.Byte[2]+
ActualReply.Value.Byte[1]+
ActualReply.Value.Byte[0];
USBReply[0]=SERIAL_HOST_ADDRESS;
USBReply[1]=SERIAL_MODULE_ADDRESS;
USBReply[2]=ActualReply.Status;
USBReply[3]=ActualReply.Opcode;
USBReply[4]=ActualReply.Value.Byte[3];
USBReply[5]=ActualReply.Value.Byte[2];
USBReply[6]=ActualReply.Value.Byte[1];
USBReply[7]=ActualReply.Value.Byte[0];
USBReply[8]=Checksum;
}
else if(TMCLReplyFormat==RF_SPECIAL)
{
for(i=0; i<9; i++)
{
USBReply[i]=SpecialReply[i];
}
}
SendUSBReply(USBReply);
}
else if(TMCLCommandState==TCS_USB_ERROR) //letztes Kommando 黚er USB hatte falsche Pr黤summe
{
ActualReply.Opcode=0;
ActualReply.Status=REPLY_CHKERR;
ActualReply.Value.Int32=0;
Checksum=SERIAL_HOST_ADDRESS+SERIAL_MODULE_ADDRESS+
ActualReply.Status+ActualReply.Opcode+
ActualReply.Value.Byte[3]+
ActualReply.Value.Byte[2]+
ActualReply.Value.Byte[1]+
ActualReply.Value.Byte[0];
USBReply[0]=SERIAL_HOST_ADDRESS;
USBReply[1]=SERIAL_MODULE_ADDRESS;
USBReply[2]=ActualReply.Status;
USBReply[3]=ActualReply.Opcode;
USBReply[4]=ActualReply.Value.Byte[3];
USBReply[5]=ActualReply.Value.Byte[2];
USBReply[6]=ActualReply.Value.Byte[1];
USBReply[7]=ActualReply.Value.Byte[0];
USBReply[8]=Checksum;
SendUSBReply(USBReply);
}
//Zustand zur點ksetze
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
TMC262_Codes.zip (26个子文件)
UART-TMC26x.h 692B
AT91SAM7X256.h 204KB
USB-TMC26x.c 22KB
Systimer-TMC26x.c 3KB
Makefile 13KB
AT91SAM7X256-RAM.ld 5KB
bits.h 1KB
Cstartup_SAM7.h 96B
StepDirIrq-TMC26x.h 422B
AT91SAM7X256-TMCM.ld 4KB
UARTIrq-TMC26x.c 4KB
UART-TMC26x.c 13KB
USB-TMC26x.h 568B
TMC262-ARM.h 4KB
TMC26x-Commands.h 2KB
TMC26x.h 2KB
SPI-TMC26x.h 385B
StepDirIrq-TMC26x.c 7KB
AT91SAM7X256-ROM.ld 4KB
SPI-TMC26x.c 3KB
TMC26x-Commands.c 26KB
Systimer-TMC26x.h 349B
TMC262-ARM.c 25KB
xtoa.c 3KB
TMC26x-Main.c 5KB
Cstartup_SAM7_16MHz.c 4KB
共 26 条
- 1
资源评论
- em784472019-02-21不错,有价值
michaelcity
- 粉丝: 7
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功