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

📄 sdhal.c.c

📁 SD卡驱动
💻 C
字号:
#include <p24fxxxx.h>
#include "generic.h"
#include "config.h"
#include "sdhal.h"

void init_spi1()
{		
#ifdef PIC24F256GB106	
	asm volatile ( "MOV #OSCCON, w1 ;"
	"MOV #0x46, w2 ;"
	"MOV #0x57, w3 ;"
	"MOV.b w2, [w1];"
	"MOV.b w3, [w1];"
	"BCLR OSCCON,#6 ;");
	
	RPINR20bits.SDI1R = 7; // RB7配置为SDI1
	RPOR3bits.RP6R = 8;	   // RB6引脚配置为SCK1
	RPOR4bits.RP9R = 7;    // RB9引脚配置为SDO1

	asm volatile ( "MOV #OSCCON, w1; "
	"MOV #0x46, w2 ;"
	"MOV #0x57, w3 ;"
	"MOV.b w2, <w1> ;"
	"MOV.b w3, <w1> ;"
	"BSET OSCCON, #6 ;" );
#endif 
	
	CS_DDR;
	
	SPI1CON1 = 0b0000000100100011;
	SPI1CON2 = 0x0000;
	SPI1STAT = 0x8000;	
	SPI1CON1bits.MSTEN =1;
	CS_HIGH;
}

/*******************************************************************************************************************
** 函数名称: void SPI_SendByte()				
** 功能描述: 通过SPI接口发送一个字节			
** 输   入: INT8U byte: 发送的字节				
** 输   出: 无		
********************************************************************************************************************/
void SPI_SendByte(char byte)
{

	SPI1BUF = byte;	
	while(SPI1STAT&0x02);

	return;		
}
/*******************************************************************************************************************
** 函数名称: INT8U SPI_RecByte()				
** 输   入: 无									
** 输   出: 收到的字节							
********************************************************************************************************************/
char SPI_RecByte(void)
{

    SPI1BUF = 0xff;
	SPI1STATbits.SPIROV		=	0;
	while(!(SPI1STAT&0x01));
	return (SPI1BUF);					
}

/*******************************************************************************************************************
** 函数名称: void SPI_CS_Assert()				
** 功能描述: 片选SPI从机						
** 输   入: 无									
** 输   出: 无									
********************************************************************************************************************/
void SPI_CS_Assert(void)
{
	 CS_LOW;			   					/* 片选SPI从机  select the SPI slave */  
}
/*******************************************************************************************************************
** 函数名称: void SPI_CS_Deassert()				
** 功能描述: 不片选SPI从机						
** 输   入: 无									
** 输   出: 无									
********************************************************************************************************************/
void SPI_CS_Deassert(void)
{
	CS_HIGH;			    				/* 不片选SPI从机  not select the SPI slave */
}
/*******************************************************************************************************************
** 函数名称:  WriteSPI				
** 功能描述: 另外一个写SPI的函数					
** 输   入: 无									
** 输   出: 无									
********************************************************************************************************************/
unsigned char WriteSPI( unsigned char data_out )
{
	BYTE	clear;
	SPI1BUF = data_out;          // write byte to SSP1BUF register
	while( !SPI1STATbits.SPIRBF ); // wait until bus cycle complete
	clear = SPI1BUF; 
	return ( 0 );                // return non-negative#
}
/*******************************************************************************************************************
** 函数名称:  void CloseSPI( void )				
** 功能描述:   SPI disable					
** 输   入: 无									
** 输   出: 无									
********************************************************************************************************************/
void CloseSPI( void )
{
	SPI1STAT &= 0x7FFF;               // disable synchronous serial port
}

/*******************************************************************************************************************
** 函数名称:  void OpenSPI( unsigned char sync_mode, unsigned char bus_mode, unsigned char smp_phase)				
** 功能描述:  spi模式选择					
** 输   入: 无									
** 输   出: 无									
********************************************************************************************************************/
void OpenSPI( unsigned char sync_mode, unsigned char bus_mode, unsigned char smp_phase)
{
  SPI1STAT = 0x0000;               // power on state 
  SPI1CON1 = 0x0000;                // power on state
  SPI1CON1 |= sync_mode;          // select serial mode 
  SPI1CON2 |= smp_phase;          // select data input sample phase

  switch( bus_mode )
  {
    case 0:                       // SPI1 bus mode 0,0
      SPI1CON1bits.CKE = 1;       // data transmitted on rising edge
      break;    
    case 2:                       // SPI1 bus mode 1,0
      SPI1CON1bits.CKP = 1;       // clock idle state high
      break;
    case 3:                       // SPI1 bus mode 1,1
      SPI1CON1bits.CKP = 1;       // clock idle state high
	  SPI1CON1bits.CKE = 0;
      break;
    default:                      // default SPI1 bus mode 0,1
      break;
  }

  switch( sync_mode )
  {
    case 4:                       // slave mode w /SS1 enable
     // TRISBbits.TRISB1 = 1;       // define /SS1 pin as input
    case 5:                       // slave mode w/o /SS1 enable
     // TRISFbits.TRISF6 = 1;       // define clock pin as input
      SPI1CON1bits.SMP = 0;       // must be cleared in slave SPI mode
      break;
    default:                      // master mode, define clock pin as output
     // TRISFbits.TRISF6 = 0;       // define clock pin as output
      break;
  }

  TRISF &= 0xFEFF;                  // define SDO1 as output (master or slave)
  TRISF |= 0x0080;                  // define SDI1 as input (master or slave)
  SPI1STATbits.SPIEN = 1;             // enable synchronous serial port 
}

/*
int main()
{	
	BYTE outch = 0x55;
	
  
	TRISBbits.TRISB6 = 0;
	TRISBbits.TRISB7 = 0;
	TRISBbits.TRISB8 = 0;
	TRISBbits.TRISB9 = 0;
	
	LATBbits.LATB6 = 1;
	LATBbits.LATB7 = 1;
	LATBbits.LATB8 = 1;
	LATBbits.LATB9 = 1;
	
		
	LATBbits.LATB6 = 0;
	LATBbits.LATB7 = 0;
	LATBbits.LATB8 = 0;
	LATBbits.LATB9 = 0; 
	
	init_spi1();
	SPI1STATbits.SPIEN = 1;
	while(1)
	{
	//	LATBbits.LATB9 = 1;
	//	LATBbits.LATB9 = 0;
		WriteSPI(outch);
	}
	return 0;
}
 
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -