📄 sdhal.c.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 + -