Код: Выделить всё
#include <mega8515.h>
#include <delay.h>
#include <stdio.h>
// SPI РАБОТАЕТ!!! Не забыть убрать инициализацию родного СПИ!!!
#define nIRQ PINB.2 //PIND.2 Прерывание
#define nSEL PORTB.4 //PORTB.4 SS
#define nSCK PORTB.7 //PORTB.7 SCK
#define nSDI PORTB.5 //PORTB.5 MOSI
#define nSDO PINB.6 //PINB.6 MISO
int init_UART(void) // Инициализация ЮАРТА
{
// Установка скорости
UBRRH=0; // UBRR=f/(16*band)-1 f=8000000Гц band=,
UBRRL=3; // нормальный асинхронный двунаправленный режим работы
// RXC - завершение приёма
// |TXC - завершение передачи
// ||UDRE - отсутствие данных для отправки
// |||FE - ошибка кадра
// ||||DOR - ошибка переполнение буфера
// |||||PE - ошибка чётности
// ||||||U2X - Двойная скорость
// |||||||MPCM - Многопроцессорный режим
// 76543210
UCSRA=0b00000000;
// RXCIE - прерывание при приёме данных
// |TXCIE - прерывание при завершение передачи
// ||UDRIE - прерывание отсутствие данных для отправки
// |||RXEN - разрешение приёма
// ||||TXEN - разрешение передачи
// |||||UCSZ2 - UCSZ0:2 размер кадра данных
// ||||||RXB8 - 9 бит принятых данных
// |||||||TXB8 - 9 бит переданных данных
// 76543210
UCSRB=0b11111000; // разрешен приём и передача по UART
// URSEL - всегда 1
// |UMSEL - режим:1-синхронный 0-асинхронный
// ||UPM1 - UPM0:1 чётность
// |||UPM0 - UPM0:1 чётность
// ||||USBS - топ биты: 0-1, 1-2
// |||||UCSZ1 - UCSZ0:2 размер кадра данных
// ||||||UCSZ0 - UCSZ0:2 размер кадра данных
// |||||||UCPOL- в синхронном режиме - тактирование
// 76543210
UCSRC=0b10000110; // 8-битовая посылка
return;
}
void send_Uart(unsigned char c)// Отправка байта через ЮАРТ
{
while(!(UCSRA&(1<<5))) // Устанавливается, когда регистр свободен
{}
UDR = c;
}
//SPI РАБОТАЕТ!!!!!!!!!!!!
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x00; // старший бит в адресе дб равен 0 (Было 0х80) зачем то поставили неверно
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSDI=(data>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
nSEL=1; // прерывание
delay_us(20);
}
unsigned char SPI_READ(unsigned char Addr) // Чтение СПИ
{
unsigned char i=0;
unsigned char data=0;
Addr=Addr&0x7F; // ??????? ??? ? ?????? ?? ????? ????!!!
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
//delay_us(200);
delay_us(20);
//if (i==8) LED_OUT(255);
}
for (i=0; i<8; i++)
{
nSCK=1;
delay_us(30);
data=data<<1;
data|=(nSDO);
nSCK=0;
delay_us(20);
}
nSEL=1; // ??????? ????
delay_us(20);
return data;
}
void SPI_RFM_INIT (void) // Инициализация RFM23BP
{
SPI_WRITE(0x06, 0x00); // interrupt all disable
SPI_WRITE(0x07, 01); // to ready mode
SPI_WRITE(0x09, 0x7f); // cap = 12.5pf
SPI_WRITE(0x0a, 0x05); //clk output is 2MHz
SPI_WRITE(0x0d, 0x00); // GPIO2 for MCLK output
SPI_WRITE(0x0e, 0x00); //GPIO port use default value
SPI_WRITE(0x0f, 0x70); // NO ADC used
SPI_WRITE(0x10, 0x00); //no adc used
SPI_WRITE(0x12, 0x00); // no temperature sensor used
SPI_WRITE(0x13, 0x00); // no temperature sensor used
SPI_WRITE(0x70, 0x20); // no mancheset code, no data whiting, data rate < 30Kbps
SPI_WRITE(0x1c, 0x04); // IF filter bandwidth
SPI_WRITE(0x1d, 0x40); // AFC LOOP
SPI_WRITE(0x1e, 0x08); //AFC timing
SPI_WRITE(0x20, 0x41); //clock recovery
SPI_WRITE(0x21, 0x60); //clock recovery
SPI_WRITE(0x22, 0x27); //clock recovery
SPI_WRITE(0x23, 0x52); //clock recovery
SPI_WRITE(0x24, 0x00); //clock recovery timing
SPI_WRITE(0x25, 0x06); //clock recovery timing
SPI_WRITE(0x6e, 0x27); // Tx data rate 1
SPI_WRITE(0x6f, 0x52); // Tx data rate 0
SPI_WRITE(0x30, 0x8c); // data access control
SPI_WRITE(0x32, 0xff); // header control
SPI_WRITE(0x33, 0x42); // // header 3, 2, 1,0 used for head length, fixed packet length, synchronize word length 3, 2,
SPI_WRITE(0x34, 64); // 64 nibble = 32byte preamble
SPI_WRITE(0x35, 0x20); //0x35 need to detect 20bit preamble
SPI_WRITE(0x36, 0x2d); // synchronize word
SPI_WRITE(0x37, 0xd4);
SPI_WRITE(0x38, 0x00);
SPI_WRITE(0x39, 0x00);
SPI_WRITE(0x3a, 's'); // set tx header
SPI_WRITE(0x3b, 'o');
SPI_WRITE(0x3c, 'n');
SPI_WRITE(0x3d, 'g');
SPI_WRITE(0x3e, 1); // total tx 17 byte
SPI_WRITE(0x3f, 's'); // set rx header
SPI_WRITE(0x40, 'o');
SPI_WRITE(0x41, 'n');
SPI_WRITE(0x42, 'g');
SPI_WRITE(0x43, 0xff); // all the bit to be checked
SPI_WRITE(0x44, 0xff); // all the bit to be checked
SPI_WRITE(0x45, 0xff); // all the bit to be checked
SPI_WRITE(0x46, 0xff); // all the bit to be checked
SPI_WRITE(0x6d, 0x03); // tx power to Max
SPI_WRITE(0x79, 0x0); // no frequency hopping
SPI_WRITE(0x7a, 0x0); // no frequency hopping
SPI_WRITE(0x71, 0x23); // Gfsk, fd[8] =0, no invert for Tx/Rx data, fifo mode, txclk -->gpio
SPI_WRITE(0x72, 0x48); // frequency deviation setting to 45k = 72*625
SPI_WRITE(0x73, 0x0); // no frequency offset
SPI_WRITE(0x74, 0x0); // no frequency offset
SPI_WRITE(0x75, 0x73); // frequency set to 860MHz
SPI_WRITE(0x76, 0x00); // frequency set to 860MHz
SPI_WRITE(0x77, 0x00); // frequency set to 860MHz
SPI_WRITE(0x0C,0b00010111); // GPIO Configuration 0.
SPI_WRITE(0x0B,0b00011000); // GPIO Configuration 1.
SPI_WRITE(0x08, 0x03); // fifo reset
SPI_WRITE(0x08, 0x00);
}
void SPI_RFM_INTREAD (void) // Разрешмет прерывание для СПИ
{
char temp;
temp = SPI_READ(0x03); //read the Interrupt Status1 register прочитать регистр состояния прерывания
temp = SPI_READ(0x04);
SPI_WRITE(0x05, 0x04); // interrupt is anable разрешить прерывание
}
interrupt [USART_RXC] void usart_rx_isr(void) // Прерывание UART
{
char data;
char data2;
UCSRB=0b00011000; // запретить прерывание ЮАРТ
data=UDR; // записать в дату 1 байт
delay_ms(500);
data2=UDR; // запись в дату2 2 байт
delay_ms(10);
PORTC=data; // из даты в Порт С
init_UART(); // инициализация ЮАРТ
delay_ms(100);
send_Uart(data); // отправка 1 байта
delay_ms(100);
send_Uart(data2); // отправка 2 байта
SPI_WRITE(data, data2);
delay_ms(100);
UCSRB=0b11111000; // разрешить прерывание Юарт
}
void main(void)
{
ACSR=0x80;
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=3;
PORTC=0xFF;
DDRC =0xFF;
DDRB.5=1;
DDRB.6=0;
DDRB.7=1;
delay_ms(500);
SPI_RFM_INIT(); // Инициализация RFM
#asm("sei")
while (1)
{
PORTC=0b10000000;
delay_ms(100);
PORTC=0b00100000;
delay_ms(100);
PORTC=0b00001000;
delay_ms(100);
PORTC=0b00000010;
delay_ms(100);
PORTC=0b00000001;
delay_ms(100);
PORTC=0b00000100;
delay_ms(100);
PORTC=0b00010000;
delay_ms(100);
PORTC=0b01000000;
delay_ms(100);
};
}