Купил платку с акселерометром MMA7455. Программа для ATtiny2313. SPI реализован программно. Может кому пригодится.
/*******************************************
Program : mma7455, SPI, USART
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 8 MHz
ATtiny2313 PB7 (SCK) - SCL/SPC mma7455
ATtiny2313 PB5 (MOSI) - SDA/SDI/SDO mma7455
ATtiny2313 PB6 (MISO) - SDO mma7455
ATtiny2313 PD0 (SS) - CS mma7455
*******************************************/
#include <avr/io.h>
#include <util/delay.h>
unsigned char usart_data = 0b00000000;
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable transmitter */
UCSRB = (1<<TXEN);
/* Set frame format: 8 data, 1 stop bit */
UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
}
void USART_Transmit( void )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = usart_data;
}
unsigned char spi_transmit_data = 0b00000000;
unsigned char spi_receive_data = 0b00000000;
unsigned char i=0;
// SPI. Master.
void SPI_Transmit_Receive( void )
{
i = 8;
while( i != 0 )
{
i -= 1;
_delay_us(5);
if( spi_transmit_data & (1<<i) ) PORTB |= (1<<5);
else PORTB &= ~(1<<5);
_delay_us(5);
PORTB |= (1<<7);
_delay_us(5);
if( PINB & (1<<6) ) spi_receive_data |= (1<<i);
else spi_receive_data &= ~(1<<i);
_delay_us(5);
PORTB &= ~(1<<7);
}
}
int main( void )
{
// System Clock Prescaler initialization
// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000000;
// Input/Output Ports initialization
// Port D initialization
DDRD = 0b00000001; // PD0 - SS
PORTD = 0b00000001;
// Port B initialization
DDRB = 0b10100000; // PB7 - SCK, PB6 - MISO, PB5 - MOSI
PORTB = 0b00000000;
// Port A initialization
DDRA = 0b00000000;
PORTA = 0b00000000;
// Baud Rate 9600 bps
USART_Init(51);
_delay_ms(200);
// mma7455 initialization
PORTD &= ~(1<<0);
spi_transmit_data = 0b10101100; // write 0x16
SPI_Transmit_Receive();
spi_transmit_data = 0b00000101; // 2g
//spi_transmit_data = 0b00001001; // 4g
//spi_transmit_data = 0b00000001; // 8g
SPI_Transmit_Receive();
PORTD |= (1<<0);
while(1)
{
PORTD &= ~(1<<0);
spi_transmit_data = 0b00001100; // read x (0x06)
SPI_Transmit_Receive();
spi_transmit_data = 0b00000000;
SPI_Transmit_Receive();
PORTD |= (1<<0);
usart_data = 0x06;
USART_Transmit();
usart_data = spi_receive_data;
USART_Transmit();
_delay_ms(3000);
PORTD &= ~(1<<0);
spi_transmit_data = 0b00001110; // read y (0x07)
SPI_Transmit_Receive();
spi_transmit_data = 0b00000000;
SPI_Transmit_Receive();
PORTD |= (1<<0);
usart_data = 0x07;
USART_Transmit();
usart_data = spi_receive_data;
USART_Transmit();
_delay_ms(3000);
PORTD &= ~(1<<0);
spi_transmit_data = 0b00010000 ; // read z (0x08)
SPI_Transmit_Receive();
spi_transmit_data = 0b00000000;
SPI_Transmit_Receive();
PORTD |= (1<<0);
usart_data = 0x08;
USART_Transmit();
usart_data = spi_receive_data;
USART_Transmit();
_delay_ms(3000);
}
return 0;
} Прикреплено изображение
|