IVN2013 0 22 марта, 2015 Опубликовано 22 марта, 2015 · Жалоба Доброго времени суток! Начал осваивать работу с FRAM FM25CL64B. Контроллер -AVR mega16, копмилятор Написал тестовую программу записи / считывания (при отправке на mega16 по USART любого байта пишу и считываю). Только вот приходят одни нули. На MISO FRAM - низкий уровень, в то время как осуществляю чтение. Выкладываю код программки, может кто что подскажет. Заранее спасибо! #include <iom16v.h> #include <macros.h> #include <eeprom.h> #include <string.h> #pragma interrupt_handler UART_RX_interrupt:12 #define ToggleBit(x, bit) (x^=(1<<bit)) static volatile unsigned char readdata=0x00; static volatile unsigned char readdata1=0x00; static volatile unsigned char readdata2=0x00; void InitUART(void) { UBRRL = 0X03; // baud rate = 115200 UBRRH = 0x00; UCSRA = 0x00; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (3<<UCSZ0)|(0<<USBS)|(1<<URSEL); /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|0x06; } void SPI_MasterInit(void) { /* Set MOSI, chip select and SCK (clock) output, MISO - input */ DDRB |= (1<<PB7)|(0<<PB6)|(1<<PB5)|(1<<PB4); PORTB |= 0b01000000; // подтягиваем пин входа /* Enable SPI, Master, set clock rate fck/16 */ SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0); //SPI Enable, SCK frequency = fosc/16 //SPCR |=(0x0C); } void SPI_MasterTransmit(unsigned char cData) { /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while(!(SPSR & (1<<SPIF))); } void UART_RX_interrupt( void ) { // отправляю данные PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110);//wren SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b01011100); //data SPI_MasterTransmit(0b00001111); //data SPI_MasterTransmit(0b11110000); //data PORTB |= 0b00010000; // chip select в 1 //////////////////////////////////////////// // считываю PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110); //wren SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address //SPCR |=(0x0C); SPI_MasterTransmit(0xff); // бросаем данные чтобы генерировались такты на sck readdata= SPDR;// // считываю данные SPI_MasterTransmit(0xff); readdata1= SPDR; SPI_MasterTransmit(0xff); readdata2= SPDR; PORTB |= 0b00010000; // chip select в 1 ///////////////////////////////////////////////////////////////// while(!( UCSRA & (1 << UDRE))); UDR = readdata; //передаю на PC по USART while(!( UCSRA & (1 << UDRE))); UDR = readdata1; while(!( UCSRA & (1 << UDRE))); UDR = readdata2; ToggleBit(DDRC,7); //мигаю диодом } void main(void) { SPI_MasterInit(); InitUART(); UCSRB |= (1<<RXCIE); // enable UART interrupts while(1) { SEI(); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 марта, 2015 Опубликовано 22 марта, 2015 (изменено) · Жалоба WREN пишется в отдельном цикле доступа (опустить-поднять чипселект) перед каждым WRITE. Про это написано и в даташите и в том примере, что я Вам отослал и который Вы получили. Кроме того, чипселект должен быть в "1" до того как начнёте что-то делать с микросхемой. У Вас же после инициализации CS держится в "0" - потом начинаем инициализировать SPI.. С остальным в вашем коде (например, какой именно SPI MODE используется - их список тоже в даташите) не разбирался. Не забыли, что всё должно питаться от +3.3? Судя по инициализации USART, тактовая процессора 8 МГц - серия процессора L или A будет работать нормально. Изменено 22 марта, 2015 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IVN2013 0 23 марта, 2015 Опубликовано 23 марта, 2015 · Жалоба Большое спасибо так и сделал, заработало. Wren "оформил" одтельным чип селектом и все остальное тоже отдельным получилось так: //запись: PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000110);//wren PORTB |= 0b00010000; PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(0b00000000); //address SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b01011100); //data SPI_MasterTransmit(0b00001111); //data SPI_MasterTransmit(0b11110000); //data PORTB |= 0b00010000; //считывание: PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000110); //wren PORTB |= 0b00010000; PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(0b00000000); //address SPI_MasterTransmit(0b00000011); //address // PORTB |= 0b01000000; SPI_MasterTransmit(0xff); readdata= SPDR;// while(!(SPSR & (1<<SPIF))); SPI_MasterTransmit(0xff); readdata1= SPDR; SPI_MasterTransmit(0xff); readdata2= SPDR; PORTB |= 0b00010000; P.S. :модераторам - тему случайно продублировал, удаляйте если нужно одну из двух Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 23 марта, 2015 Опубликовано 23 марта, 2015 · Жалоба WREN при чтении не требуется. Ну и если на будущее - используйте HEX форму записи констант. Считать позицию битов с экрана просто никак невозможно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IVN2013 0 24 марта, 2015 Опубликовано 24 марта, 2015 · Жалоба Спасибо! Попробую читать без WREN. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 24 марта, 2015 Опубликовано 24 марта, 2015 · Жалоба Надеюсь, сделать начальное состояние CS "1" не забыли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IVN2013 0 24 марта, 2015 Опубликовано 24 марта, 2015 · Жалоба Да, теперь начальное в "1". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться