Всем доброго времени суток!
Помогите теперь мне, ткните пальцем, носом, только не бейте )))
У меня 2 Атмеги8 и 2 RFM12B-433 хочу сделать между ними передачу.
Хотя бы одностороннюю. Бился бился...
Можете показать 100% рабочий код на прием и передачу с каждой стороны?
Код: Выделить всё
Код для работы с RFM12. Проверено с мегой32, тини24, тини2313.
Приём:
Код:
#define DDR_SS DDRD
#define DDR_SCK DDRC
#define DDR_MOSI DDRD
#define PORT_SS PORTD
#define PORT_SCK PORTC
#define PORT_MOSI PORTD
#define PIN_MISO PINC
#define PIN_IRQ PIND
#define SS 6
#define SCK 0
#define MOSI 7
#define MISO 1
#define IRQ 2
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int RFXX_WRT_CMD(unsigned int aCmd) //Отправить команду
{
unsigned char i;
unsigned int temp=0;
PORT_SCK&=~(1<<SCK);
PORT_SS&=~(1<<SS);
for(i=0;i<16;i++)
{
if(aCmd&0x8000) PORT_MOSI|=(1<<MOSI);
else PORT_MOSI&=~(1<<MOSI);
PORT_SCK|=(1<<SCK);
temp<<=1;
if(PIN_MISO&(1<<MISO)) temp|=0x0001;
PORT_SCK&=~(1<<SCK);
aCmd<<=1;
}
PORT_SS|=(1<<SS);
return(temp);
}
void RF12_INIT(void) //Инициализация
{
DDR_SS|=(1<<SS);
DDR_SCK|=(1<<SCK);
DDR_MOSI|=(1<<MOSI);
PORT_SS|=(1<<SS);
RFXX_WRT_CMD(0x80D8);//EL,EF,433band,12.5pF
RFXX_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
RFXX_WRT_CMD(0xA640);//A140=430.8MHz
RFXX_WRT_CMD(0xC647);//4.8kbps
RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
RFXX_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
RFXX_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
RFXX_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
RFXX_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
RFXX_WRT_CMD(0xE000);//NOT USE
RFXX_WRT_CMD(0xC800);//NOT USE
RFXX_WRT_CMD(0xC040);//1.66MHz,2.2V
}
int main ()
{
//Внешнее прерывание от INT0, к которому цепляем nIRQ
MCUCR|=(1<<ISC01);
GICR|=(1<<INT0);
sei();
//Инициализация FRM12
RF12_INIT();
//Включаем fifo буфер и читаем статус регистр
RFXX_WRT_CMD(0xCA83);
RFXX_WRT_CMD(0x0000);
}
ISR(INT0_vect) //обработчик внешнего прерывания
{
//тут хаваем данные с RFM12
data=((RFXX_WRT_CMD(0xB000))&0x00FF);
}
Передача:
Код:
void RF12_SEND(unsigned char aByte)
{
while(!(RFXX_WRT_CMD(0x0000)&0x8000));
RFXX_WRT_CMD(0xB800+aByte);
}
int main ()
{
//Инициализация FRM12
RF12_INIT();
RFXX_WRT_CMD(0xCA81);
RFXX_WRT_CMD(0x0000);//read status register
RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
RF12_SEND(0xAA);//PREAMBLE
RF12_SEND(0xAA);//PREAMBLE
RF12_SEND(0xAA);//PREAMBLE
RF12_SEND(0x2D);//SYNC HI BYTE
RF12_SEND(0xD4);//SYNC LOW BYTE
RF12_SEND(data); //тут передаём что хотим
RF12_SEND(0xAA);//DUMMY BYTE
RF12_SEND(0xAA);//DUMMY BYTE
RF12_SEND(0xAA);//DUMMY BYTE
}
В данном случаи подключения контролера к трансиверу следующее?
контрол Трансивер
SS (PD6) -> SS
SCK (PC0) -> SCK
MOSI (PD7) -> SDI ???
MISO (PC1) -> SDO???
PD2 -> iRQ
Я так понял, что вот этот код рабочий?