avr123.nm.ru писал(а):
Советую посмотреть осцилограммы (хотябы в PROTEUS) и убедится что обмен по SPI правильный. Попробуйте прочитать читаемые регистры трансивера - адекватные ли данные оттуда читаются.
Переписал код для меги под аппаратный spi с mode1. Проверил на осциллографе в протеусе. Вроде норм все. В железе же ничего не работает. Прочитать там можно только биты статуса и насколько я понимаю они равны 0 когда ничего не принимается с передатчика. 0 и получаю.
Буду рад если кто то глянет и подскажет, а то из-за этого модуля уже три дня работа не движется дальше.
последний код приемника:
Код:
#include <mega8.h>
#include <stdint.h>
#include <delay.h>
#define NIRQ PINB.1
#define CS PORTB.2
#define LED PORTB.0
#define SPIF 7
int8_t usart_read()
{
while(!(UCSRA & (1<<7)))
{
}
return UDR;
}
usart_write(int8_t bite)
{
while(!(UCSRA & (1<<5)))
{
}
UDR=bite;
}
spi_write_cmd(int8_t bite1, int8_t bite2)
{
CS=0;
SPDR=bite1;
while ((SPSR & (1<<SPIF))==0);
SPDR=bite2;
while ((SPSR & (1<<SPIF))==0);
CS=1;
}
spi_write_data(int8_t bite)
{
spi_write_cmd(0xB8,bite);
}
transiver_send_data(int8_t bite1,int8_t bite2)
{
spi_write_cmd(0x82,0x28);
delay_us(4);
spi_write_cmd(0x82,0x38);
delay_us(4);
spi_write_data(0xAA);
spi_write_data(0xAA);
spi_write_data(0xAA);
spi_write_data(0x2D);
spi_write_data(0xD4);
spi_write_data(0xFF);
spi_write_data(bite1);
spi_write_data(bite2);
spi_write_data(0xAA);
spi_write_cmd(0x82,0x08);
spi_write_cmd(0x82,0xD8); //Переводим обратно в режим чтения.
delay_ms(1);
usart_write('s'); usart_write('e'); usart_write('n'); usart_write('d');
}
int8_t transiver_status() // Временная проверка
{
CS=0;
SPDR=0x00;
while ((SPSR & (1<<SPIF))==0);
usart_write(SPDR);
SPDR=0x00;
while ((SPSR & (1<<SPIF))==0);
usart_write(SPDR);
CS=1;
return SPDR;
}
int8_t spi_read_data()
{
CS=0;
SPDR=0xB0;
while ((SPSR & (1<<SPIF))==0);
usart_write(SPDR);
SPDR=0x00;
while ((SPSR & (1<<SPIF))==0);
usart_write(SPDR);
CS=1;
return SPDR;
}
spi_fifo_reset()
{
spi_write_cmd(0xCA,0x80);
spi_write_cmd(0xCA,0x83);
}
void main(void)
{
PORTB=0x00;
DDRB=0x2C;
DDRB.0=1;
PORTB.0=1;
DDRB.1=0;
PORTB.1=0;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
CS=1;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 500,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
//SPCR=0x51;
//SPSR=0x00;
SPCR=0x55;
SPSR=0x00;
spi_write_cmd(0x80,0xD8);
spi_write_cmd(0x82,0xD8);
spi_write_cmd(0xA6,0x40);
spi_write_cmd(0xC6,0x47);
spi_write_cmd(0xCC,0x77);
spi_write_cmd(0x94,0xA0);
spi_write_cmd(0xC2,0xAC);
spi_write_cmd(0xCA,0x83);
spi_write_cmd(0xC4,0x8B);
spi_write_cmd(0x98,0x50);
spi_write_cmd(0xE0,0x00);
spi_write_cmd(0xC8,0x00);
spi_write_cmd(0xC0,0xE0);
spi_write_cmd(0x82,0xC8);
usart_write('O'); usart_write('K');
transiver_status();
delay_ms(1000);
while (1)
{
delay_ms(100);
//transiver_status();
if(!NIRQ)
{
LED=~LED;
transiver_status();
usart_write(spi_read_data());
spi_fifo_reset();
}
};
}
Код передатчика
Код:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 16.04.2011
Author : AvrMeg
Company : AvrMeg
Comments:
Chip type : ATtiny2313
Clock frequency : 8,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
/* RFM12B INTERFACE */
#define SCK 7 // SPI clock
#define SDO 6 // SPI Data output (RFM12B side)
#define SDI 5 // SPI Data input (RFM12B side)
#define CS 4 // SPI SS (chip select)
#define NIRQ 3 // (PORTB)
/* IO CONTROL */
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PORTB.3==1)
/* LED */
#define LED 6
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)
void portInit() {
HI(CS);
HI(SDI);
LO(SCK);
DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
DDRD = (1<<LED);
}
unsigned int writeCmd(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++) {
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( PINB&(1<<SDO) ) {
recv|=0x0001;
}
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
void rfInit()
{
writeCmd(0x80D8);
writeCmd(0x8219);
writeCmd(0xA640);
writeCmd(0xC647);
writeCmd(0xCC77);
writeCmd(0x94A0);
writeCmd(0xC2AC);
writeCmd(0xCA83);
writeCmd(0xC48B);
writeCmd(0x9850);
writeCmd(0xE000);
writeCmd(0xC800);
writeCmd(0xC0E0);
}
void rfSend(unsigned char data){
WAIT_NIRQ_LOW();
writeCmd(0xB800 + data);
}
void main(void)
{
volatile unsigned int i;
DDRB=0;
DDRD=0;
DDRA=0;
PORTB=0;
PORTD=0;
PORTA=0;
#asm("cli");
delay_ms(100);
portInit();
delay_ms(100);
rfInit();
while(1){
LED_ON();
delay_ms(100);
writeCmd(0x8238);
rfSend(0xAA); // PREAMBLE
rfSend(0xAA);
rfSend(0xAA);
rfSend(0x2D); // SYNC
rfSend(0xD4);
for(i=0; i<16; i++) {
rfSend(0x30+i);
}
rfSend(0xAA); // DUMMY BYTES
rfSend(0xAA);
rfSend(0xAA);
writeCmd(0x8208);
LED_OFF();
delay_ms(100);
};
}