не могу прочитать данные из региста IDATA косвенной адресации, возможно есть ошибки в коде, не могли бы вы мне помочь?регистр SWFLAG 000000 флаг аппаратного прерывания IERQFLG 0х040F, ACK - приходит
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "define.h"
void USART_Init( unsigned int baud )
{
UCSR1A = (1<<U2X1);
// Установка скорости связи
uint16_t b=0;
b = (uint16_t)((F_CPU/(16 * baud))-1);
UBRR1H = 0; //(uint8_t)((b>>8)&0x000F);
UBRR1L = (uint8_t)b;
// Разрешение работы передатчика и приемника, разрешение прерывания по приходу байта
UCSR1B = (1<<RXEN1)|(1<<TXEN1);
// Установка формата посылки: 8 бит данных, 2 стоп-бита
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10)|(1<<USBS1);
}
void USART_Transmit( unsigned char data )
{
/* Ожидание освобождения буфера передатчика */
while ( !( UCSR1A & (1<<UDRE1)) );
/* Помещение данных в буфер, отправка данных */
UDR1 = data;
}
unsigned char USART_Receive( void )
{
// Ожидание окончания приема данных
while ( !(UCSR1A & (1<<RXC1)) );
// Загрузка принятых данных из буфера
return UDR1;
}
int main(void)
{
USART_Init(9600);
DDRD|=(1<<3); //PD3 = UART_TXD
DDRD&=~(1<<2); //PD2 = UART_RXD
DDRG = 0xFF; // Direct address - output
DDRB = 0b11110111; // cs,we,rd,reset,irq,PB6,PB7 - output; ack - input
CS_1; WE_1; RD_1; RESET_1; IRQ_1;
HDATOUT;
unsigned long iadd = 0x00050000;
unsigned long idata;
unsigned char irqflag,i=0;
unsigned long parametr[15] = {0x00000010,0x00000002,0x00000002,0x00000003,0x00000003,0x00000000,0x00000000,0x
00000000,
0x00000001,0x00000040,0x00000000,0x00000000,0x00000040,0x00000001,0x0000000
2};
RESET_0;
_delay_us(20);
RESET_1;
_delay_us(20);
// PRE - Initialization //
DIRRECT_REG(PLL_HI);
HDATA_0_7(0x08);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(20);
DIRRECT_REG(PLL_LO);
HDATA_0_7(0x04);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(20);
DIRRECT_REG(BOOT);
HDATA_0_7(0x8A);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
DIRRECT_REG(BMODE);
HDATA_0_7(0x0A);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
DIRRECT_REG(MMODE);
HDATA_0_7(0x0A);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
// Load FIRMWARE //
USART_Transmit('R');
USART_Transmit('e');
USART_Transmit('a');
USART_Transmit('d');
USART_Transmit('y');
USART_Transmit('!');
while(!(UCSR1A & (1<<RXC1)));
for(iadd = 0x00050000;iadd <= 0x00051FFF;iadd++)
{
DIRRECT_REG(IADDR);
HDATA_0_7(iadd);
HDATA_8_15(iadd >> 8);
HDATA_16_23(iadd >> 16);
HDATA_24_31(iadd >> 24);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
DIRRECT_REG(IDATA);
HDATA_0_7(USART_Receive());
HDATA_8_15(USART_Receive());
HDATA_16_23(USART_Receive());
HDATA_24_31(USART_Receive());
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
}
// Cheek Firmware //
for(
iadd = 0x00050000;iadd <= 0x00051FFF;iadd++)
{
HDATOUT;
DIRRECT_REG(IADDR);
HDATA_0_7(iadd);
HDATA_8_15(iadd >> 8);
HDATA_16_23(iadd >> 16);
HDATA_24_31(iadd >> 24);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
HDATIN;
DIRRECT_REG(IDATA);
CS_0; RD_0;
_delay_us(10);
RD_1;CS_1;
_delay_us(1000);
}
// POST - Initialization //
HDATOUT;
DIRRECT_REG(BOOT);
HDATA_0_7(0x8D);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
DIRRECT_REG(BMODE);
HDATA_0_7(0x0A);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
DIRRECT_REG(MMODE);
HDATA_0_7(0x0A);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
// Set Parameter //
for(iadd = 0x00057F00;iadd <= 0x00057F0F;iadd++)
{
DIRRECT_REG(IADDR);
HDATA_0_7(iadd);
HDATA_8_15(iadd >> 8);
HDATA_16_23(iadd >> 16);
HDATA_24_31(iadd >> 24);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
DIRRECT_REG(IDATA);
idata = parametr[i];
HDATA_0_7(idata);
HDATA_8_15(idata>>8);
HDATA_16_23(idata>>16);
HDATA_24_31(idata>>24);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
i++;
}
DIRRECT_REG(EIRQIE);
HDATA_0_7(0x00);
HDATA_8_15(0x04);
CS_0; WE_0;
_delay_us(10);
WE_1;CS_1;
_delay_us(1000);
// Hardware Interrupt //
IRQ_0;
_delay_us(100);
IRQ_1;
HDATIN;
while(!(irqflag==0x04))
{
DIRRECT_REG(EIRQFLG);
CS_0;RD_0;
_delay_us(10);
irqflag = PORTF;
RD_1;CS_1;
_delay_ms(1000);
}
while(1){
DIRRECT_REG(SWFLAG);
CS_0;RD_0;
_delay_us(10);
RD_1;CS_1;
_delay_ms(1000);
}
}
#ifndef DEFINE_H_
#define DEFINE_H_
#define CS 0
#define WE 1
#define RD 2
#define ACK 3
#define IRQ 4
#define RESET 5
#define CS_1 PORTB|=(1<<CS)
#define CS_0 PORTB&=~(1<<CS)
#define WE_1 PORTB|=(1<<WE)
#define WE_0 PORTB&=~(1<<WE)
#define RD_1 PORTB|=(1<<RD)
#define RD_0 PORTB&=~(1<<RD)
#define IRQ_1 PORTB|=(1<<IRQ)
#define IRQ_0 PORTB&=~(1<<IRQ)
#define RESET_1 PORTB|=(1<<RESET)
#define RESET_0 PORTB&=~(1<<RESET)
#define HDATOUT DDRE = 0xFF; DDRF = 0xFF; DDRA = 0xFF; DDRC = 0xFF
#define HDATIN DDRE = 0x00; DDRF = 0x00; DDRA = 0x00; DDRC = 0x00
#define HDATA_0_7(x) PORTE = x
#define HDATA_8_15(x) PORTF = x
#define HDATA_16_23(x) PORTA = x
#define HDATA_24_31(x) PORTC = x
#define DIRRECT_REG(x) PORTG = x
/* Direct register memory map */
#define PIXEL 0x00 // PIXEL FIFO Access Register
#define CODE 0x01 // Compressed Code-Stream Access Register
#define ATTR 0x02 // ATTR FIFO Access Register
/* Reserved address 0x03 and 0x04 */
#define EIRQIE 0x05 // External Interrupt Enabled
#define EIRQFLG 0x06 // External Interrupt Flags
#define SWFLAG 0x07 // Software Flag Register (Read Only)
#define BMODE 0x08 // Bus Mode Configuration Register
#define MMODE 0x09 // Miscellaneous Mode Register
#define STAGE 0x0A // Staging Register
#define IADDR 0x0B // Indirect Address Register
#define IDATA 0x0C // Indirect Data Register
#define BOOT 0x0D // Boot Mode Register
#define PLL_HI 0x0E // PLL Control Register - High Byte
#define PLL_LO 0x0F // PLL Control Register - Low Byte
#endif