兰峰控制xc1004四轴SPI运动控制芯片xc1006六轴SPI插补运动控制芯片与单 片机通信的代码

#include <intrins.h>
#include <reg52.h>
//MCU: stc8f2k08s2
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr P5 = 0xC8;
sfr SPSTAT = 0xcd;
sfr SPCTL = 0xce;
sfr SPDAT = 0xcf;
sfr IE2 = 0xaf;
sfr AUXR = 0x8e;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr P_SW2 = 0xba;

#define CKSEL (*(unsigned char volatile xdata )0xfe00)
#define CKDIV (
(unsigned char volatile xdata )0xfe01)
#define IRC24MCR (
(unsigned char volatile xdata )0xfe02)
#define XOSCCR (
(unsigned char volatile xdata )0xfe03)
#define IRC32KCR (
(unsigned char volatile xdata *)0xfe04)

//#define FOSC 16000000UL //使用外部16M晶振
#define FOSC 24000000UL //使用内部24M晶振
#define BRT (65536 - FOSC / 115200 / 4) //定义115200波特率

sbit b2 = P1^1;
sbit b1 = P5^5;
sbit led = P3^5;

sbit cs3 = P3^3;
sbit cs2 = P3^2;
sbit cs1 = P1^2;
sbit sck = P1^5;
sbit in = P1^4;
sbit out = P1^3;
#define SPI3_CSHIGH cs3=1 // CS3
#define SPI3_CSLOW cs3=0

#define SPI2_CSHIGH cs2=1 // CS2
#define SPI2_CSLOW cs2=0

#define SPI1_CSHIGH cs1=1 // CS1
#define SPI1_CSLOW cs1=0

#define SPI_SCKHIGH sck=1 //SCK
#define SPI_SCKLOW sck=0
#define SPI_OUTHIGH out=1
#define SPI_OUTLOW out=0//MOSI
#define SPI_IN in//MISO

unsigned char inbuf[50] = {0};
unsigned char b1_state=0;

long sxnum;

void initial()
{
P1M1 = 0;
P1M0 = 0x2c; // 引脚模拟通信时,MOSI,SCK, CS 设为推挽输出

SPI1_CSHIGH; //CS不使用时设为高
SPI2_CSHIGH;
SPI3_CSHIGH;
SPI_SCKLOW;//SCK空闲状态一定要为低电平。

/// spi模拟通信时不用
SPCTL = 0xd0; //使能SPI主机模式
SPSTAT = 0xc0; //清中断标志

}

void init_uart()
{

SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;

}

/*
串口发送一个字节。
*/
void USART_Txbyte(unsigned char i)
{
SBUF = i;
while(TI ==0);
TI = 0;
}

/*
串口发送一串数据。
*/
void USRAT_transmit(unsigned char *fdata,unsigned char len)
{
unsigned char i;

for(i=0;i<len;i++)
{
USART_Txbyte(fdata[i]);
}

}

void delay_nus(unsigned long n)
{
unsigned long j;
while(n–)

   {
          j=1;	  
        while(j--);
   }

}

//延时n ms

void delay_nms(unsigned long n)

{
while(n–)
delay_nus(1000);

}

/*
函数名: SPI_SendData
功能:软件模拟SPI通讯发送并接收一个8位字节数据。
如需使用硬件SPI,单片机作为主机,运动控制芯片为从机。CPHA=0,CPOL=0,高位在前,SPI数据宽度为8位。
空闲状态下单片机SCK引脚必须为低电平。每一条指令开始发送前将CS引脚置低,整条指令发送完成后必须将CS置高。
每条指令间需有时间间隔,推荐延时1MS以上。

*/

unsigned char aSPI_SendData(unsigned char outdata)
{

unsigned char RecevieData=0,i;
SPI_SCKLOW;
// nop(); nop(); nop();nop(); nop();nop(); nop(); nop(); nop(); nop();nop(); nop(); nop(); nop(); nop();

for(i=0;i<8;i++)
{
SPI_SCKLOW;
nop(); nop(); nop();nop(); nop();nop(); nop(); nop(); nop(); nop();nop(); nop(); nop(); nop(); nop();

if(outdata&0x80)
{
SPI_OUTHIGH;
}
else
{
SPI_OUTLOW;
}
outdata<<=1;

nop(); nop(); nop();nop(); nop();nop(); nop(); nop(); nop(); nop();nop(); nop(); nop(); nop(); nop();

SPI_SCKHIGH; //

RecevieData <<= 1;

if(SPI_IN)
{
RecevieData |= 1;
}

nop(); nop(); nop();nop(); nop();nop(); nop(); nop(); nop(); nop();nop(); nop(); nop(); nop(); nop();

SPI_SCKLOW;
}

delay_nus(1); //发一个字节延时下

return RecevieData;

}

unsigned char SPI_SendData(unsigned char outdata)
{

unsigned char RecevieData=0,i;

SPDAT = outdata; //发送数据
while (!(SPSTAT & 0x80)); //查询完成标志
SPSTAT = 0xc0; //清中断标志
return SPDAT;

}

/*
函数名: enabled_cs
功能:SPI运动控制模块使能对应芯片模块的CS脚
参数:
cardno 卡号
用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片模块关联使用。
*/
void enabled_cs(unsigned char cardno)
{
if(cardno1)
{
SPI1_CSLOW;
}
if(cardno
2)
{
SPI2_CSLOW;
}

if(cardno==3)
{
SPI3_CSLOW;
}

}

/*
函数名: disabled_cs
功能:SPI运动控制模块禁止对应芯片模块的CS脚
参数:
cardno 卡号
用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片关联使用。
*/
void disabled_cs(unsigned char cardno)
{

if(cardno1)
{
SPI1_CSHIGH;
}
if(cardno
2)
{
SPI2_CSHIGH;
}

if(cardno==3)
{
SPI3_CSHIGH;
}

}

/*
函数名: set_speed
功能:设置轴速度
参数:
cardno 卡号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值