📄 final.pde
字号:
#include <math.h>
#define SSNT 10 // chip selsect(slave select), active low
#define MOSI 11 // SDA(master out, slave in)
#define MISO 12 // SDO(master in, slave out)
#define SCLK 13 // SPI clock
/* -------------------------------------------------------------------------------
* Function name: char spi_transfer(volatile char)
* Function description:
* Note: The ATMega168 has a register called SPDR that, when written to, begins
* an SPI transaction. Once you start a transaction, you have a choice of two
* ways to handle it. One is to simply wait around until the transaction is over,
* indicated by the SPIF bit being set. The other is to set up an interrupt
* vector for this bit, which will result in a designated function being called
* when the interrupt occurs.Performing the actual transaction over the SPI bus
* is handled largely in hardware.
* -------------------------------------------------------------------------------
*/
char spi_transfer(volatile char data) {
SPDR = data;
// Loop right here until the transaction is complete. the SPIF bit is the SPI
// Interrupt Flag. When interrupts are enabled, and the SPIE bit is set
// enabling SPI interrupts, this bit will set when the transaction is finished.
while (!(SPSR & (1<<SPIF))){}
// received data appears in the SPDR register
return SPDR;
}
/* -------------------------------------------------------------------------------
* Function name: char read_register(char)
* Function description: reads a register
* -------------------------------------------------------------------------------
*/
char read_register(char register_name) {
char in_byte;
// need to reset bit 7 to indicate a read
register_name &= 127;
// SS is active low
digitalWrite(SSNT, LOW);
// send the address of the register we want to read first
spi_transfer(register_name);
// send nothing, but here's when the device sends back the register's value as an 8 bit byte
in_byte = spi_transfer(0);
// deselect the device
digitalWrite(SSNT, HIGH);
return in_byte;
}
/* -------------------------------------------------------------------------------
* Function name: void write_register(char, byte)
* Function description: writes a register
* -------------------------------------------------------------------------------
*/
void write_register(char register_name, byte data) {
// set bit 7 to indicate we're doing a write
register_name |= 128;
// SS is active low
digitalWrite(SSNT, LOW);
// send the address of the register we want to write
spi_transfer(register_name);
// send the data we're writing
spi_transfer(data);
digitalWrite(SSNT, HIGH);
}
/* --------------------------------------------------------------------------------
* Fun name: void setup_spi_com ()
* Fun desc: configures common SPI pins
* --------------------------------------------------------------------------------
*/
int MOTION = 9;
void setup_spi_com(){
pinMode(MOSI,OUTPUT);
pinMode(MISO,INPUT);
pinMode(SCLK,OUTPUT);
pinMode(MOTION,INPUT);
}
/* --------------------------------------------------------------------------------
* Fun name: void setup_spi_acc ()
* Fun desc: start up the device, this essentially activates the device, powers
* it on, enables all axes, and turn off the self test
* --------------------------------------------------------------------------------
*/
void setup_spi_acc(){
pinMode(SSNT,OUTPUT);
digitalWrite(SSNT,HIGH); // disable device
pinMode(SSNT, OUTPUT);
// Set the SPCR register to 01010000; interrupt disabled, spi enabled, msb 1st,
// master, clk low when idle, sample on leading edge of clk, system clock/4 rate
SPCR = (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA);
// Write 0x5a to register 0x3a
write_register(0x3a, 0x5A);
delay(250);
}
/* --------------------------------------------------------------------------------
* Fun name: self_test
* Fun desc:
* --------------------------------------------------------------------------------
*/
void self_test() {
byte crc0, crc1, crc2, crc3;
write_register(0x10, 0x01);
crc0 = read_register(0x0c);
crc1 = read_register(0x0d);
crc2 = read_register(0x0e);
crc3 = read_register(0x0f);
Serial.print(crc0, DEC);
Serial.print(44, BYTE);
Serial.print(crc1, DEC);
Serial.print(44, BYTE);
Serial.print(crc2, DEC);
Serial.print(44, BYTE);
Serial.print(crc3, DEC);
Serial.print('\n', BYTE);
delay(300);
}
/* --------------------------------------------------------------------------------
* Fun name:
* Fun desc:
* --------------------------------------------------------------------------------
*/
int x_val, y_val, motion, x_sum, y_sum, product_id, inverse_product_id, motionpin;
void setup() {
Serial.begin(9600);
setup_spi_com();
setup_spi_acc();
}
void loop() {
product_id = read_register(0x00);
inverse_product_id = read_register(0x3f);
inverse_product_id = ~inverse_product_id;
if(product_id==inverse_product_id)
{
motionpin = digitalRead(MOTION);
if(motionpin==0){
motion = read_register(0x02);
y_val = read_register(0x03);
x_val = read_register(0x04);
Serial.print(x_val, DEC);
Serial.print(44, BYTE);
Serial.print(y_val, DEC);
Serial.print(44, BYTE);
Serial.print('\n', BYTE);
}
}
write_register(0x00, 0x0D);
write_register(0x3f, 0xF2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -