變態(tài)版3線SPI總線實現(xiàn)(DS1302時鐘芯片用)
如題, 這個是網(wǎng)上所謂的變態(tài)版的3線SPI總線:一根時鐘線,一根使能線,一根雙向IO線.
一個模塊,兩個文件:
//spi3.c
#include "typedef.h"
#include "spi3.h"
/***********************************************************************
名稱:init_spi3
描述:SPI3初始化函數(shù)
參數(shù):(無)
返回:(無)
說明:
***********************************************************************/
void init_spi3(void)
{
SPI3_DIR |= SPI3_SCLK;
SPI3_OUT |= SPI3_SCLK;
}
/**************************************************************************
* 函數(shù):向3線SPI總線寫入一個字節(jié),低位在前
* 參數(shù):dat - 待寫入的數(shù)據(jù)字節(jié)
* 返回:
* 說明:
*************************************************************************/
void spi3_send_byte(unsigned char dat)
{
unsigned char cx=8;
SPI3_DIR |= SPI3_IO;
while(cx--){
if(dat&0x01) SPI3_IO_1;
else SPI3_IO_0;
SPI3_SCLK_0;
SPI3_SCLK_1;
dat >>= 1;
}
}
/**************************************************************************
* 函數(shù):從3線SPI總線讀取一個字節(jié)
* 參數(shù):
* 返回:
* 說明:
*************************************************************************/
unsigned char spi3_recv_byte(void)
{
unsigned char cx=8;
unsigned char dat=0;
SPI3_DIR &= ~SPI3_IO;
while(cx--){
dat>>=1;
if(SPI3_IN & SPI3_IO) dat |= 0x80;
else dat &= ~0x80;
SPI3_SCLK_0;
SPI3_SCLK_1;
}
return dat;
}
//spi3.h
#ifndef __SPI3_H__
#define __SPI3_H__
//考慮到外部可能會控制時鐘,
//所以我把定義放在這里來了
#define SPI3_IN P4IN
#define SPI3_OUT P4OUT
#define SPI3_DIR P4DIR
#define SPI3_IO BIT1
#define SPI3_IO_0 SPI3_OUT &= ~SPI3_IO
#define SPI3_IO_1 SPI3_OUT |= SPI3_IO
#define SPI3_SCLK BIT2
#define SPI3_SCLK_0 SPI3_OUT &= ~SPI3_SCLK
#define SPI3_SCLK_1 SPI3_OUT |= SPI3_SCLK
void init_spi3(void);
void spi3_send_byte(unsigned char dat);
unsigned char spi3_recv_byte(void);
#endif//!__SPI3_H__
typedef.h 里面包含了msp430的頭文件, 以及一些基本的, 常用的類型的定義, 自己定義就行了, 我不再帖出來.