📄 spi.txt
字号:
使用c8051f005通过SPI读取SCA100T角度值的程序收藏
c8051f005读取SCA100T之程序,SCA100T仍是VI出的一款角度传感器,测量范围为+90~-90度,具体资料见其PDF
//spi.h
unsigned int SPI_ReadBits( uchar n );
void SPI_WriteByte( uchar wdata );
void SPI_Start(void);
void SPI_Stop(void);
void SPI_Reset(void);
void SPI_Delay(unsigned char);
unsigned int SPI_GetX( void );
unsigned int SPI_GetY( void );
void SPI_Init( void );
#define MEAS 0x00 //测量模式
#define RWTR 0x08 //读写温度数据寄存器
#define STX 0x0E //x通道自检
#define STY 0x0F //Y通道自检
#define RDAX 0x10 //读X通道加速度值
#define RDAY 0x11 //读Y通道加速度值
sbit CLK = P0^7;
sbit MISO = P1^0;
sbit MOSI = P1^1;
sbit CSB = P1^2;
//spi.c
#include <c8051f000.h>
#include "defs_c51_manio.h"
#include "spi.h"
void SPI_Stop( void ){
CLK = LOW;
CSB = HIGH;
SPI_Delay(10);
}
void SPI_Reset(void){
SPI_Stop();
}
void SPI_Delay(uchar n){
while(n--);
}
void SPI_Start(void){
CLK = LOW;
CSB = LOW;
SPI_Delay(10);
}
//主机写一个BYTE到器件
//最终状态:CLK = LOW
void SPI_WriteByte( uchar wdata ){
uchar i;
for( i = 0 ; i < 8 ; ++i ){
CLK = LOW;
SPI_Delay(10);
MOSI = wdata & 0x80;
wdata = wdata << 1;
SPI_Delay(10);
CLK = HIGH;
SPI_Delay(10);
}
CLK = LOW;
}
/*
//主机读入一个比特
//结束状态: CLK=0
bit SPI_ReadBit(void){
CLK = HIGH;
SPI_Delay(10);
CLK = LOW;
SPI_Delay(10);
return MISO;
}
*/
//主机读入N个比特
//n 限制为16及其以下
//结束状态 CLK = 0
uint SPI_ReadBits( uchar n ){
uint rtemp,i;
MISO = 1;
for( i = 0 ; i < n ; ++i ){
rtemp <<= 1 ;
SPI_Delay(10);
if( MISO == 1 ){
rtemp |= 0x0001;
}else{
rtemp &= 0xFFFE;
}
CLK = HIGH;
SPI_Delay(10);
CLK = LOW;
SPI_Delay(10);
}
return rtemp;
}
uint SPI_GetX( void ){
uint result;
SPI_Start();
SPI_WriteByte( RDAX );
result = SPI_ReadBits(11);
SPI_Stop();
return result;
}
uint SPI_GetY( void ){
uint result;
SPI_Start();
SPI_WriteByte( RDAY );
result = SPI_ReadBits(11);
SPI_Stop();
return result;
}
void SPI_Init( void ){
SPI_Start();
SPI_WriteByte( MEAS );
SPI_Stop();
}
//defs_c51_manio.h
//manio's 51 defs
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;
sbit P3_0 = P3^0;
sbit P3_1 = P3^1;
sbit P3_2 = P3^2;
sbit P3_3 = P3^3;
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
sbit P3_7 = P3^7;
//main.c
/****************************************************
* Template for C8051F00x written by Manio,http://blog.csdn.net/manio
* This template aim to make the program more clear
* to read and write.
* Any other function file should follow this rule.
****************************************************/
#include <c8051f000.h>
#include "defs_c51_manio.h"
#include "spi.h"
/////////////////////////////////////////////////////
// Include function head file here
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// Define Global macro #define xxx xxxxx
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// Define Global var
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// DECLARE LOCAL FUNCTION
/////////////////////////////////////////////////////
void MCU_Init(void);
void LongDelay( void ){
uint i ;
for ( i = 0 ; i < 30 ; ++i );
}
main(){
uint result;
//CLEAN THE DOG
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
//SET THE CRYSTAL
//OSCICN = (OSCICN & 0xf0) | 0x07; //use the inner crystal and set to 16MHZ
//All the module initial here
MCU_Init();
P1 = 0xf0; //Initialize the inner reg, etc.interrupt timer pwm...
//Operations
SPI_Reset();
SPI_Delay(1000);
SPI_Init();
SPI_Delay(1000);
while(1){
result = SPI_GetX();
//P1 = result >>3;
//LongDelay();
}
}
/////////////////////////////////////////////////////
// DEFINE FUNCTION USED IN MAIN
/////////////////////////////////////////////////////
/****************************************************
* MCU_Init
* Function: initiallize interrupt ,crystal ....
****************************************************/
void MCU_Init(void){
//SET THE CROSSBAR eg. XBR0 XBR1 XBR2
XBR2 = 0x40;
//SET THE IO MODE PRTxCF
PRT0CF = 0xff;
PRT1CF = 0xff;
//Timer Init
//Interrupt Setting
//Interrupt Enable Disable
//Other inner reg setting ,LIKE SMBus PWM PCA...
//Global interrupt Enable or Disable
//EA = 1;
}
/////////////////////////////////////////////////////
// DEFINE INTERRUPT FUNCTION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -