реклама на сайте
подробности

 
 
> Внешняя I2C EEPROM 24AA1025
Pavel_Bor
сообщение Jul 12 2011, 09:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Код
.......
void Serial_Flash_Write(unsigned char byte,unsigned char card_adr,unsigned char adress_H,unsigned char adress_L)
{
    SF_Start_Soft();
    SF_Tx_Soft(AA1025_ADDR|card_adr|WR);    //adress Memory Card
    SF_Tx_Soft(adress_H);            //adress High
    SF_Tx_Soft(adress_L);            //adress Low  
    SF_Tx_Soft(byte);
    SF_Stop_Soft();
}
.......



CODE
.......
#define SERIAL_FLASH_DATA_DIR_SET PORTD.DIRSET|=(1<<SERIAL_FLASH_DATA)
#define SERIAL_FLASH_DATA_DIR_CLR PORTD.DIRCLR&=(1<<SERIAL_FLASH_DATA)
#define SERIAL_FLASH_DATA_SET PORTD.OUTSET|=(1<<SERIAL_FLASH_DATA)
#define SERIAL_FLASH_DATA_CLR PORTD.OUTCLR&=(1<<SERIAL_FLASH_DATA)

#define SERIAL_FLASH_SCL_DIR_SET PORTD.DIRSET|=(1<<SERIAL_FLASH_SCL)
#define SERIAL_FLASH_SCL_UP PORTD.OUTSET|=(1<<SERIAL_FLASH_SCL)
#define SERIAL_FLASH_SCL_DOWN PORTD.OUTCLR&=(1<<SERIAL_FLASH_SCL)

void SF_Init_Soft(void);
void SF_Start_Soft(void);
void SF_Stop_Soft(void);
void SF_Tx_Soft(unsigned char byte);
unsigned char SF_Rx_Soft(unsigned char last_byte);
unsigned char SF_In_Sda(void);

unsigned char SF_error_soft; //error

void SF_Init_Soft(void) //Init Programm I2C
{

SERIAL_FLASH_DATA_DIR_SET;
SERIAL_FLASH_SCL_DIR_SET;
SERIAL_FLASH_SCL_UP; //and SCL in high impedance condition
SF_error_soft=0; //for first no error :-)
}

void SF_Start_Soft(void) //Set Start condition
{
if(SF_error_soft)
return;
SERIAL_FLASH_DATA_DIR_SET;
SERIAL_FLASH_DATA_SET;
delay_us(100);
SERIAL_FLASH_SCL_UP;
delay_us(100);
SERIAL_FLASH_DATA_CLR;
delay_us(100);
SERIAL_FLASH_SCL_DOWN;
}

void SF_Stop_Soft(void) //Set Start condition
{
SERIAL_FLASH_DATA_DIR_SET;
SERIAL_FLASH_DATA_CLR;
delay_us(100);
SERIAL_FLASH_SCL_UP;
delay_us(100);
SERIAL_FLASH_DATA_SET;
delay_us(100);
if(SF_error_soft)
SF_Init_Soft();
}

void SF_Tx_Soft(unsigned char byte) //Send Byte
{
unsigned char count;
if(SF_error_soft)
return;

SERIAL_FLASH_DATA_DIR_SET;
if(SF_error_soft)
return;
for(count=0;count<8;count++)
{
if(byte&0x80)
SERIAL_FLASH_DATA_SET;
else
SERIAL_FLASH_DATA_CLR;
SERIAL_FLASH_SCL_UP;
delay_us(10);
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
byte<<=1;
}
SERIAL_FLASH_DATA_DIR_CLR;
SERIAL_FLASH_SCL_UP;
SF_error_soft=SF_In_Sda();
rtcTime.status=SF_error_soft;
delay_us(10);
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
}

unsigned char SF_Rx_Soft(unsigned char last_byte)
//Recieve byte,if last_byte=0, then bytes? which recieved is last, and no needed request from master
{
unsigned char data=0;
unsigned char mask=0x80;
unsigned char count;

if(SF_error_soft)
return 0;
SERIAL_FLASH_DATA_DIR_CLR;
for(count=0;count<8;count++)
{
SERIAL_FLASH_SCL_UP;
delay_us(10);
if(SF_In_Sda())
data=data+mask;
mask>>=1;
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
}
SERIAL_FLASH_DATA_DIR_SET;
if(last_byte)
SERIAL_FLASH_DATA_CLR;
else
SERIAL_FLASH_DATA_SET;
SERIAL_FLASH_SCL_UP;
delay_us(10);
SERIAL_FLASH_SCL_DOWN;
delay_us(10);
return data;
}

unsigned char SF_In_Sda(void) //Return SDA_line level
{
if(PORTD.IN&(1<<SERIAL_FLASH_DATA))
return 1;
else
return 0;
}
.......


Программа работает неверно, при 4 входе в запись нет АСК.
В чем может быть причина?

Сообщение отредактировал IgorKossak - Jul 21 2011, 14:22
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Jul 13 2011, 09:58
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Pavel_Bor @ Jul 12 2011, 12:05) *
В чем может быть причина?
http://electronix.ru/forum/index.php?s=&am...st&p=231608 и далее по ветке.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 21 2011, 12:09
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Цитата(Сергей Борщ @ Jul 13 2011, 12:58) *

Ветка очень интересная.
из ветки:
1. Изменил код программы.
2. В моей схеме подтяжек нет. Какого номинала подтяжки лучше поставить.
3. При чтении всегда АСК не успевает пройти, как решить эту проблему.

Проблемы:
1. При чтении "неважно чего" получаю 255
2. АСК проходит через раз, независимо это R/W.
3. попробовал через цикл while(!i2cPutbyte(i2cAddr)); АСК проходит но значения также не те.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 21 2011, 12:43
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Pavel_Bor @ Jul 21 2011, 15:09) *
1. Изменил код программы.
2. В моей схеме подтяжек нет. Какого номинала подтяжки лучше поставить.
Для небольшой платы и одного slave на частоте до 100КГц хватает 4.7К. Если вы изменили код программы и перестали выдавать единицу из контроллера методом
CODE
#define SERIAL_FLASH_DATA_SET       PORTD.OUTSET|=(1<<SERIAL_FLASH_DATA)
, то у вас вообще все должно перестать работать, что правильно. Как вы умудряетесь читать 255, если единице на шине без подтяжек взяться просто неоткуда - загадка. Разберитесь с этим, будем смотреть дальше.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Pavel_Bor   Внешняя I2C EEPROM 24AA1025   Jul 12 2011, 09:05
- - ILYAUL   ЦитатаВ моей схеме подтяжек нет. Какого номинала п...   Jul 21 2011, 12:46
- - Pavel_Bor   код изменял в соответствии с тем который описан в ...   Jul 21 2011, 13:30
- - Сергей Борщ   QUOTE (Pavel_Bor @ Jul 21 2011, 16:30) ко...   Jul 21 2011, 13:48
- - Pavel_Bor   ЦитатаНадо делать так: Код#define I2C_SDL_LO POR...   Jul 22 2011, 06:17
- - Андрей190   если речь об XMEGA то, как уже выше было сказано, ...   Jul 22 2011, 07:27
- - Сергей Борщ   QUOTE (Pavel_Bor @ Jul 22 2011, 09:17) (П...   Jul 22 2011, 07:56
- - Pavel_Bor   Цитата(Сергей Борщ @ Jul 22 2011, 10:56) ...   Jul 22 2011, 08:02
- - Сергей Борщ   QUOTE (Pavel_Bor @ Jul 22 2011, 11:02) Ск...   Jul 22 2011, 08:25
- - Pavel_Bor   Цитата(Сергей Борщ @ Jul 22 2011, 11:25) ...   Jul 22 2011, 08:46
- - Сергей Борщ   QUOTE (Pavel_Bor @ Jul 22 2011, 11:46) А ...   Jul 22 2011, 09:06
- - Pavel_Bor   Цитата(Сергей Борщ @ Jul 22 2011, 12:06) ...   Jul 22 2011, 09:42
- - Сергей Борщ   QUOTE (Pavel_Bor @ Jul 22 2011, 12:42) Вы...   Jul 22 2011, 10:39
|- - Pavel_Bor   вот и причина плавающих данных с одного места.. По...   Jul 22 2011, 10:54
- - Pavel_Bor   Изменил код, пока безрезультатно. CODE#define I2C...   Jul 22 2011, 11:58
- - Сергей Борщ   QUOTE (Pavel_Bor @ Jul 22 2011, 14:58) CO...   Jul 22 2011, 13:35
- - Pavel_Bor   Цитата(Сергей Борщ @ Jul 22 2011, 16:35) ...   Jul 25 2011, 05:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016