⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_to_uart.c

📁 基于芯片DS1302的湍流实时时钟的实现
💻 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 + -