Skocz do zawartości

[c][Atmega8][93c86] potrzebuje kod do obsługi tego eepromu


Master Dragon

Pomocna odpowiedź

Witam. Potrzebuje jakiegoś dobrego kodu w C do obsługi eeprom 93c86 (spi) nie radze sobie z nim. A dokładnie odczytać mi się go udało tylko nie mogę go zapisać może pomożecie. Może być do jakiegoś podobnego. Nie koniecznie do tego tyle to sobie przerobię.

albo przeanalizujcie ten kod który napisałem i powiedzcie co jest źle że to nie działa

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include "uart.h"

void init_spi(void)
{
  PORTB |= _BV(2)|_BV(3);
  PORTB &=~ _BV(5);
  DDRB |= _BV(2)|_BV(3)|_BV(5);
  DDRB &=~ _BV(4);

  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<SPR1)|(1<<CPOL);
  SPSR = (0<<SPI2X);
}

void wyslij_spi(unsigned char bajt)
{
  SPDR = bajt;
  while(!(SPSR & _BV(7)));
}

unsigned char odbierz_spi(void)
{

  while(!(SPSR & _BV(7)));
  return(SPDR);
}

void wlancz_zapis (void)
{
  PORTB |= _BV(2);
  wyslij_spi(0b100);
  wyslij_spi(0b11000000);
  PORTB |= _BV(2);
}

void wylancz_zapis (void)
{
  PORTB |= _BV(2);
  wyslij_spi(0b100);
  wyslij_spi(0b00000000);
  PORTB |= _BV(2);
}

void wyczysc_wszystko (void)
{
  PORTB |= _BV(2);
  wyslij_spi(0b100);
  wyslij_spi(0b10000000);
  PORTB |= _BV(2);
}

unsigned char eeprom_czytaj(unsigned short int address)
{
  unsigned char HiByte, LoByte, data;
  HiByte = address >> 8;
  LoByte = address & 0x00FF;

  PORTB |= _BV(2);
  PORTB &=~ _BV(5);
  wyslij_spi(0b110);
  wyslij_spi(HiByte);
  wyslij_spi(LoByte);
  data = odbierz_spi();
  PORTB &=~ _BV(2);
  return(data);
}

void eeprom_zapisz(unsigned short int address, unsigned char data)
{
  unsigned char HiByte, LoByte;
  HiByte = address >> 8;
  LoByte = address & 0x00FF;

  PORTB |= _BV(2);
  PORTB &=~ _BV(5);
  wyslij_spi(0b101);
  wyslij_spi(HiByte);
  wyslij_spi(LoByte);
  wyslij_spi(data);
  PORTB &=~ _BV(2);
}


int main(void)
{
  unsigned short int i;
  DDRC |= _BV(5);
  DDRC &=~ _BV(4)|_BV(3)|_BV(2);
  PORTC &=~ _BV(5);
  PORTC |= _BV(4)|_BV(3)|_BV(2);
  UART_init();
  init_spi();
  PORTC |= _BV(5);
  while(1)
  {
     if(!(PINC & _BV(2)))
     {
        i = 0x0000;
        _delay_ms(30);
        if(!(PINC & _BV(2)))
        {
           PORTC &=~ _BV(5);
           UART_putstr_P(PSTR("Zapis"));
           i = 0;
           wlancz_zapis();
           do{
           eeprom_zapisz(i,0xFF);
           i++;
           }while( i <= 0x0800);
           wylancz_zapis();
        }
     PORTC |= _BV(5);
     UART_putstr_P(PSTR("Koniec"));
     }

     if(!(PINC & _BV(3)))
     {
        _delay_ms(30);
        if(!(PINC & _BV(3)))
        {
           PORTC &=~ _BV(5);
           UART_putstr_P(PSTR("Zapis 0x00e0"));
           wlancz_zapis();
           eeprom_zapisz(0x00e0,0xFF);
           wylancz_zapis();
        }
     PORTC |= _BV(5);
     UART_putstr_P(PSTR("Koniec"));
     }

     if(!(PINC & _BV(4)))
     {
        _delay_ms(30);
        if(!(PINC & _BV(4)))
        {
           i = 0x0000;
           PORTC &=~ _BV(5);
           UART_putstr_P(PSTR("Odczyt"));
           _delay_us(10);
           do{
           UART_putchar(eeprom_czytaj(i));
           i++;
           }while( i <= 0x0800);
        }
     PORTC |= _BV(5);
     }
  }
} 

Wszystkim z Góry dziękuje i PROSZE POMÓŻCIE 🙁🙁🙁

Link do komentarza
Share on other sites

Co do opisu nie mogę za wiele zdradzić bo to grubsza sprawa jest ale co nie co podpowiem.

1. Spi sobie z tym nie poradzi bo ilość bitu jest zmienna w zależności od układu 93Cxx.

2. Obsługę trzeba napisać ręcznie jeśli chodzi o C bardzo prosta sprawa w datasheet jest wszystko narysowane.

3. Można skorzystać z BASCOM tam podobno jest cała biblioteka do tego czy coś nie wiem dokładnie bo nie korzystam.

4. A jeszcze jedno uwaga na 93C86 , 93C76 dobrze poczytać dokumentacje bo jest tam zmiana w nóżkach trzeba jedną nóżkę podpiąć do plusa jak chce się coś zapisywać to co w innych układach jest nie używana, najlepiej to sobie ściągnąć dokumentacje tylko do tych eepromów.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.