📄 seek_line_spi.c
字号:
/*********************************************************/
unsigned char rev_buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //1 to 8存储接收到的8个数据
unsigned char send_buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//SPI initialisation
// clock rate: 62500hz
void spi_init(void)
{
//从机片选端设定, PD2 & PD3 进行从机选择
PORTD |= (BIT(3) | BIT(2));
DDRD |= (BIT(3) | BIT(2));
/* 设置SS, MOSI 和SCK 为输出,其他为输入 */
PORTB |= 0xF0; //
DDRB |= ( (1<<5) | (1<<7) | (1<<4)) ; //配置SPI输出口,
DDRB &= ~BIT(6); //设MISO为输入口
/* 使能SPI 主机模式,设置时钟速率为fck/128 */
SPCR = ((1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0));
SPSR = 0x00; //setup SPI
}
/* ******************************************************************
/**********************************************************************/
//被传输数据前加的命令字
/**********************************************************************/
#define CMD_START 0X40 //发送数据之前先发送起动命令字
/**********************************************************************/
#define RISEGO 0x88
#define RISEBACK 0x89
#define PUSH2GO 0x8A
#define PUSH2BACK 0x8B
#define PUSH1GO 0x87
#define PID_RESET 0XA4 //复位指令(0数据指令)
#define FREE_STOP 0X81 //自由停机指令(0数据指令)
#define SPEED_SET 0X80 //速度设定(双数据指令)
#define DISTANCE_SET 0X90 //位置设定(四数据指令)
/**********************************************************************/
//片选A,B控制器端口定义 R-A,L-B;
#define SELA PORTD &= ~BIT( 2 )
#define USELA PORTD |= BIT( 2 )
#define SELB PORTD &= ~BIT( 3 )
#define USELB PORTD |= BIT( 3 )
/**********************************************************************/
/* ******************************************************************
* 功能:利用同步串口向从机(a,b电机)发送数据 *
* 参数: *
* data: 发送数据流指针,
* dataLen,发送数据流长度 *
* motor,发送对象(0,A控制器;1,B控制器;3或其它,同时发送至两控制器) *
motor = 1,右, 0,左
*********************************************************************/
void Master_send( unsigned char *data, unsigned char dataLen, unsigned char motor )
{
unsigned char i;
if( motor == 0 ) SELA;
else if( motor == 1 ) SELB;
else
{
SELA;
SELB;
}
i=100;
while(i--);
SPDR = (CMD_START | 0x00) + dataLen; //主机向从机发送起始命令字
while( !( SPSR & BIT( SPIF ) ) );
for( i = 0; i < dataLen; i ++ )
{
SPDR = data[i];
while( !( SPSR & BIT( SPIF ) ) );
//delay_s(1);
}
USELA;
USELB;
}
/* ******************************************************************
* 功能:利用同步串口从从机(a,b电机)接收dataLen长度的数据 *
* 参数: *
* dataLen, 接收数据流长度 *
* motor,发送对象(0,A控制器;1,B控制器;3或其它,同时发送至两控制器) *
motor = 1,右, 0,左
*********************************************************************/
void Master_rev(unsigned char dataLen, unsigned char motor)
{
unsigned char i = 0;
unsigned char j = 0;
if( motor == 0 ) SELA;
else if( motor == 1 ) SELB;
else
{
SELA;
SELB;
}
j =100;
while(j--);
SPDR = (CMD_START | 0x10) + dataLen; //主机向从机发送起始命令字
while( !( SPSR & BIT( SPIF ) ) );
for (i = 0; i < dataLen; i++)
{
j =100;
while(j--); //延时等待从机将数据准备好
SPDR = 0x00; //启动SPI
while( !( SPSR & BIT( SPIF ) ) ); //等待发送完毕。
rev_buf[i] = SPDR;
}
USELA;
USELB;
}
void set_stop(unsigned char motor)
{
unsigned char buf;
buf = FREE_STOP;
Master_send(&buf,1,motor);
}
void set_speed (signed int num_speed ,unsigned char motor)
{
unsigned char buf[3];
buf[0] = SPEED_SET;
buf[1] = num_speed>>8;
buf[2] = (unsigned char)num_speed;
Master_send(buf,3,motor);
}
void set_distance (signed long num_distance ,unsigned char motor)
{
unsigned char buf[5];
buf[0] = DISTANCE_SET;
buf[4] = (unsigned char)num_distance;
num_distance >>= 8;
buf[3] = (unsigned char)num_distance;
num_distance >>= 8;
buf[2] = (unsigned char)num_distance;
num_distance >>= 8;
buf[1] = (unsigned char)num_distance;
Master_send(buf,5,motor);
}
void PID_reset(unsigned char motor)
{
unsigned char buf;
buf = PID_RESET;
Master_send(&buf,1,motor);
}
void risego(void)
{
unsigned char buf[1];
buf[0] = RISEGO;
Master_send(buf,1,1);
//Master_send(buf,1,0);
}
void riseback(void)
{
unsigned char buf[1];
buf[0] = RISEBACK;
//Master_send(buf,1,1);
Master_send(buf,1,1);
}
void push2go(void)
{
unsigned char buf[1];
buf[0] = PUSH2GO;
//Master_send(buf,1,1);
Master_send(buf,1,0);
}
void push2back(void)
{
unsigned char buf[1];
buf[0] = PUSH2BACK;
//Master_send(buf,1,1);
Master_send(buf,1,0);
}
void push1go(void)
{
unsigned char buf[1];
buf[0] = PUSH1GO;
//Master_send(buf,1,1);
Master_send(buf,1,1);
}
#pragma interrupt_handler spi_stc_isr:11
void spi_stc_isr(void)
{
//byte in SPDR has been sent/received
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -