📄 spi_to_uart.c
字号:
#include <util/delay.h>
#include "global.h"
#include <avr/io.h>
#include "spi_to_uart.h"
#include <avr/interrupt.h>
void delay_spi_tcss()
{
//100ns
NOP();
NOP();
}
/**********************************************************************
* Function Name InitSPI
* Function Desc 对单片机的SPI口进行初始化设置
* Return Value 无
* Parameter 无
* Version Date Editor Modification
* 1.0 2007/05/14 史玮 做成
**********************************************************************/
void InitSPI(void)
{
PORTB |= (1<<PORTB3)|(1<<PORTB4); //MISO上拉电阻有效
DDRB |=(1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB4); //MISO=input and MOSI,SCK,SS = output SPI接口: SS-PB0,SCLK - PB1,DI- PB2,DO- PB3,SHDN - PB4
SPCR=0x51; // 53 shi SPI128分频为115K左右。 MSB先发,主机模式,SPI使能
// 52 是 64分频 51 是 16分频
///////////////外部中断配置
EIMSK = (1<<INT0);
// EICRA = (1<<ISC01); //下降沿触发外部中断0
PORTD |= (1<<PORTD0);
}
/**********************************************************************
* Function Name max3100_init
* Function Desc 对MAX3100进行初始化设置
* Return Value 无
* Parameter 无
* Version Date Editor Modification
* 1.0 2007/05/14 史玮 做成
**********************************************************************/
void max3100_init(void)
{
InitSPI();
max3100_write_config();
}
/**********************************************************************
* Function Name spi_rx_tx
* Function Desc 从SPI口发送读取一个字节的数据
* Return Value 返回的数据
* Parameter 发送的数据
* Version Date Editor Modification
* 1.0 2007/05/14 史玮 做成
**********************************************************************/
UCHAR spi_rx_tx(UCHAR cData)
{
SPDR = cData;
// cli();
//EIMSK &= ~(1<<INT0);
while(!(SPSR & (1<<SPIF)));
cData =SPDR;
//EIMSK |= (1<<INT0);
return(SPDR);
}
/**********************************************************************
* Function Name max3100_write_config
* Function Desc 对MAX3100的UART进行写配置
* Return Value 返回的数据
* Parameter 发送的数据
* Version Date Editor Modification
*备注:设置为波特率为38.4K,一个停止位,无奇偶校验,数据长度为8bit,接收中断;
* 1.0 2007/05/14 史玮 做成
**********************************************************************/
void max3100_write_config()
{
PORTB &=~(1<<PB0);
delay_spi_tcss();//ss置0
EIMSK &= ~(1<<INT0);
spi_rx_tx(0xc4); //max3100配置写操作,接收到数据中断;
spi_rx_tx(0x09); //boud rate38400,you奇偶校验,8位,一个停止位
// 0x09 no parity 0x29 have parity;
EIMSK |= (1<<INT0);
PORTB|=(1<<PB0);
delay_spi_tcss();//ss置1//ss置1
}
/**********************************************************************
* Function Name max3100_read_config
* Function Desc 读取MAX3100的配置
* Return Value 无
* Parameter *cData 返回数据的指针
* Version Date Editor Modification
* 1.0 2007/05/14 史玮 做成
**********************************************************************/
void max3100_read_config( volatile UCHAR *cData)
{
UCHAR first_byte,second_byte;
PORTB &=~(1<<PB0); //ss置0
delay_spi_tcss(); //DELAY
EIMSK &= ~(1<<INT0);
first_byte = spi_rx_tx(0x40); //max3100配置读操作
second_byte = spi_rx_tx(0x00);//0x01是进入test模式
EIMSK |= (1<<INT0);
//NOP10(); //DELAY
PORTB|=(1<<PB0);//ss置1//ss置1
delay_spi_tcss(); //DELAY
*cData = first_byte;
*(cData+1)= second_byte;
}
/************************************************************
向max3100写一个字节的数据;
************************************************************/
UCHAR max3100_write_data(UCHAR cData)
{
UCHAR i,j;
//
PORTB &=~(1<<PB0);delay_spi_tcss();//ss置0
EIMSK &= ~(1<<INT0);
i = spi_rx_tx(0x80); //max3100数据写操作
j = spi_rx_tx(cData); //要发送的数据
EIMSK |= (1<<INT0);
PORTB|=(1<<PB0);
delay_spi_tcss();//ss置1//ss置1
//MAX3100_T_FLAG = 1;
//
return i;
}
/************************************************************/
/*参数:*cData 读取的数据 指针变量
************************************************************/
void max3100_read_data(volatile UCHAR *pData)
{
UCHAR first_byte,second_byte;
PORTB &=~(1<<PB0);
delay_spi_tcss();//ss置0
EIMSK &= ~(1<<INT0);
first_byte = spi_rx_tx(0x00);
second_byte = spi_rx_tx(0x00);
EIMSK |= (1<<INT0);
//NOP10();
PORTB|=(1<<PB0);
delay_spi_tcss();//ss置1//ss置1
*pData = first_byte;
*(pData+1)= second_byte;
}
/*********************************************************************************************/
//OddParityBit 奇偶校验程序读
//输入参数: unsigned char ParityData 输出参数: unsigned char ParityBit 最低位为需要的校验码
/*********************************************************************************************/
void NOP10(void)
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -