Easyelectronics.ru

Электроника для всех
Текущее время: 09 дек 2019, 16:14

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Помогите разобраться с SPI
СообщениеДобавлено: 18 сен 2014, 04:30 
Здравствуйте!

Зарегистрирован: 18 сен 2014, 04:00
Сообщения: 1
Есть вот такая железка:
http://www.pic16.com/en/wzcapi/mcd_demo2.htm
На ней репетирую программный SPI, общение с eeprom 94LC46 (работает в 8ми битном режиме, ORG=0).
Вот код:
Код:
#include <stdio.h>
#include <stdlib.h>

#include <htc.h>
#include <pic1687x.h>

__CONFIG(HS & WDTDIS);

#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif

#define CS     RC2
#define CLK    RC3
#define DO     RC5
#define DI     RC4

#define   ee_addr  0x5

unsigned char sdata;
unsigned char saddr;

const char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

unsigned int  temp;

void blink_led200(void)
{
        RC0=1;
        __delay_ms(200);
        RC0=0;
        __delay_ms(200);
}

void spi_send_byte(unsigned char data)
{
    int i;
    CLK=0;
    for(i=7;i>=0;i--)
    {
      DO=(data & 0x01)?1:0;
      data=data>>1;
      CLK=1;
      NOP();
      CLK=0;
   }
}

void spi_write_byte(unsigned char addr, unsigned char data, unsigned char waitwrite)
{
    signed char i;

    // Send EWEN sequence

    CS=1;
    spi_send_byte(0b11001);
    CS=0;
    NOP();
   
    CS=1;
    DO=1; NOP(); CLK=1; NOP(); CLK=0;
    DO=0; NOP(); CLK=1; NOP(); CLK=0;
    DO=1; NOP(); CLK=1; NOP(); CLK=0;

    // Send address

    spi_send_byte(addr);

    // Send data
           
    spi_send_byte(data);

    CS=0;
    NOP();
    CS=1;
    NOP();
    //while (DI==0) ;
    __delay_ms(4);
    NOP();
    CS=0;

}

unsigned char spi_read_byte(unsigned char addr)
{
    int i;
    unsigned char data = 0;
   
    CLK=0;
    CS=1;

    DO=1; NOP(); CLK=1; NOP(); CLK=0;
    DO=1; NOP(); CLK=1; NOP(); CLK=0;
    DO=0; NOP(); CLK=1; NOP(); CLK=0;

    // Send address
    spi_send_byte(addr);
    DO=0;

    data=0;
    for(i=0; i<8; i++)//Read a Byte
    {
      data=data<<1;
      CLK=1;
      data|=((DI & 1)?1:0);
      CLK=0;

    }

    CS=0;
   
    return data;
}

void display(unsigned char d)
{
     int i;
     i=d&0xf0;
     i=i>>4;
     PORTD=table[i];
     PORTA=0x37;
     __delay_us(100);
     i=d&0x0f;
     PORTD=table[i];
     PORTA=0x3b;
     __delay_us(100);
}


void spi_init(void)
{
    PORTC=0;
    TRISC2=0;
    TRISC3=0;
    TRISC4=1;
    TRISC5=0;
}

void mcu_init(void)
{
     OPTION=0;
     ADCON1=0X07;
     TRISA=0X30;
     TRISB=0b00001111;
     TRISD=0X00;
     PORTD=0XFF;

    spi_init();
    TRISC0=0;
    RC0=0;

   

}

int main(int argc, char** argv) {

    mcu_init();

    blink_led200();

    saddr=0x5;
    sdata=0x56;

    while (1)
    {
           if(!RB1)
           {
                blink_led200();
                spi_write_byte(ee_addr, sdata, 1);
                blink_led200();               
           }

            if(!RB2)
            {
                blink_led200();
                sdata=0;
                sdata=spi_read_byte(ee_addr);   
                blink_led200();               
            }

          display(sdata);
    }

    return (EXIT_SUCCESS);
}



В протеусе эмуляции не вышло, так и не нашёл библиотек для 94c46..
Пришлось отлаживать всё в железе. Проблема в том, что чтение проходит с виду без проблем а вот записать никак не получается.. Скурил много раз даташит eeprom, всё перепроверил, не хочет писать и всё.. Чтобы не быть голословным, во вложении диаграмма записи и чтения с железячного логического анализатора, данные снимал прямо с платы разработки.
В двух словах процесс записи:
1. стартовый бит SB (CS, DO в 1, после этого один CLK)
2. отправляем инструкцию WREN (10011xxx), тем самым разрешая запись
3. отправляем опять бит SB + код операции записи (01) + Адрес(0х05) + Данные(0х56)

После этого на лини DI должно быть удержание 1 со стороны eeprom в течении 2мс, что говорит о том что идёт запись, но как видно на диаграмме с анализатора, там ничего нет. При чтении адреса 0x05 получаю в данные 0хFF, т.е. ничего не записалось(...

Подскажите пож что делаю не так, зло берёт не удержаться, с виду простая задача, а решить не могу(((.....
Заранее благодарен!!


Вложения:
Комментарий к файлу: Диаграмма чтения
spi_r_custom.png
spi_r_custom.png [ 16.61 Кб | Просмотров: 2804 ]
Комментарий к файлу: Диаграмма записи
spi_w_custom.png
spi_w_custom.png [ 17.25 Кб | Просмотров: 2804 ]
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB