📄 spi.c
字号:
/*******************************************************************************
- Chip : MG24500/55
- Author : RadioPulse Inc, 2007.
- Date : 2007-07-02
- Version : VER 1.0
*******************************************************************************/
#include "INCLUDE_TOP.h"
#define SPI_CSN P3_7
#define SPI_CLK P3_6
#define SPI_DO P3_5
#define SPI_DI P3_4
//-- Mode
// bit[4] : 1=Master
// bit[3] : CPOL, 1=SCK default high, 0=SCK default low
// bit[2] : CPHA, bit transition timing
// If CPOL=0, 0=falling edge, 1=rising edge
// If CPOL=1, 0=rising edge, 1=falling edge
//-- Speed
// @8MHz System Clock @16MHz System Clock
// 0 : 1000 KHz 2000 KHz
// 1 : 500 KHz 1000 KHz
// 2 : 250 KHz 500 KHz
// 3 : 125 KHz 250 KHz
// 4 : 62.5 KHz 125 KHz
// 5 : 31.2 KHz 62.5 KHz
// 6 : 15.6 KHz 31.2 KHz
// 7 : 7.8 KHz 15.6 KHz
// 8 : 3.9 KHz 7.8 KHz
// 9 : 1.9 KHz 3.9 KHz
void ZHAL_SPI_SET(UINT8 Ena, UINT8 Mode, UINT8 Speed)
{
UINT8 Div;
if(Speed == 1) Div = 0x05;
else if(Speed == 2) Div = 0x03;
else if(Speed == 3) Div = 0x04;
else if(Speed > 9) Div = 0x0B;
else Div = Speed + 2;
xSPCR = 0x00;
xSPER = 0x00;
xSPCR |= Div & 0x03 ;
xSPER |= (Div & 0x0C) >> 2;
if(Ena)
{
if(Mode & 0x10) // Master
{
SPI_DI = 1;
SPI_DO = (Mode & 0x08)? 1 : 0;
SPI_CLK = (Mode & 0x08)? 1 : 0;
SPI_CSN = 0;
P3REN &= 0x0F; // P3REN = 0000_xxxx
P3REN |= 0xE0; // P3REN = 111x_xxxx --> P3REN = 1110_xxxx
P3OEN |= 0xF0; // P3OEN = 1111_xxxx
P3OEN &= 0x1F; // P3OEN = 000x_xxxx --> P3OEN = 0001_xxxx
}
else // Slave Mode
{
SPI_DI = 1;
SPI_DO = (Mode & 0x08)? 1 : 0;
SPI_CLK = 1;
SPI_CSN = 1;
P3REN &= 0x0F; // P3REN = 0000_xxxx
P3REN |= 0x20; // P3REN = xx1x_xxxx --> P3REN = 0010_xxxx
P3OEN |= 0xF0; // P3OEN = 1111_xxxx
P3OEN &= 0xDF; // P3OEN = xx0x_xxxx --> P3OEN = 1101_xxxx
}
xSPCR |= (Mode & 0x3C) ;
xSPCR |= 0xC0; // bit[7;6] = 2'b11, if bit[6] is 1 from 0, RD/WR pointer is reset
SPIIE = 1;
if( (Mode & 0x10) == 0) // Slave Mode
{
xSPDR = 0x55; // 1st Dummy Write
}
}
else
{
xSPCR = 0x00;
SPIIE = 0;
}
}
extern UINT8 INT_SPI;
extern UINT8 SPI_RD_DATA;
UINT8 ZHAL_SPI_MASTER(UINT8 SendByte)
{
xSPDR = SendByte;
while(!INT_SPI);
INT_SPI = 0;
return SPI_RD_DATA;
}
// Return
// 1 : Received Data OK
// 0 : No Received Data
UINT8 ZHAL_SPI_SLAVE(UINT8* pReceiveByte, UINT8 NextSendByte)
{
if(INT_SPI)
{
*pReceiveByte = SPI_RD_DATA;
INT_SPI = 0;
xSPDR = NextSendByte; // Dummy Write
return 1;
}
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -