查看: 467  |  回复: 0
分享单片机SPI控制步进伺服电机做运动控制的C代码,各种单片机都可以移植
兰峰控制
1
主题
0
回复
发表于2023-03-09 15:49:01 | 只看该作者
1# 电梯直达

#include <intrins.h>

#include <reg52.h>

//MCU: stc8f2k08s2

//兰峰控制xc1004四轴SPI运动控制芯片    

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;                              //清中断标志

   

CKDIV=1;    

                       

}


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;


}




贴不了这么多内容,完整的在附件里,要看的下载


allspi51soft.rar xc1004文档.rar 

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部