3. Опис та часові діаграми команд мікросхеми 24LC08В
Команда читання (RANDOM_READ) – це команда читання даних, що дозволяє читати дані випадковим способом з будь-якої ділянки пам’яті. Для організації цієї команди необхідно за допомогою надіслання певної комбінації кодів( так, як показано на рисунку 3.1 ) задати адресу та блок пам’яті звідки ми збираємося читати дані.
Рисунок 3.1 Часова діаграма команди читання
Команда читання (CURRENT_ADDRESS_READ) – це команда читання даних, що дозволяє читати дані з адреси останнього слова доступу збільшеного на 1. Для організації цієї команди необхідно за допомогою надіслання певної комбінації кодів( так, як показано на рисунку 3.1 ) задати адресу та блок пам’яті звідки ми збираємося читати дані.
Рисунок 3.2 Часова діаграма команди читання
Команда запису (BYTE_WRITE) – це команда запису байту. Вона виконується за допомогою надіслання такої комбінації кодів яка показана на рисунку 3.2. Для ії організації треба задати адрес та блок пам'яті, куди буде записуватись байт. Після того, як байт запишеться необхідно подати сигнал стоп, а потім подавати сигнал старт та керуючий байт до того, доки байт не запишется.
Рисунок 3.3 Часова діаграма команди запису
4. Опис та блок-схеми програми та підпрограм, що обслуговує пристрій
Список констант:
DATA | 0х378 – адреса регістру даних |
STATUS | 0х379 – адреса регістру стану |
CONTROL | 0х37А – адреса регістру керування |
Список функцій:
high_SDA() | Встановлює 1 на лінії SDA |
low_SDA() | Встановлює 0 на лінії SDA |
high_SCL() | Встановлює 1 на лінії SDL |
low_SCL() | Встановлює 0 на лінії SDL |
nack() | Повертає зачення сигналу ACK |
Start() | Надсилає команду START |
Stop() | Надсилає команду STOP |
out_byte(byte o_byte) | Надсилає байт |
in_byte() | Зчитує байт |
write_byte(int device, int address, byte data) | Записує вказаний байт за вказаною адресою |
read_random_data(int device, int address) | Зчитує байт за випадковою адресою(в межах 4кб) |
read_cur_adr() | Зчитує байт за поточною адресою |
write_to_file(int adr) | Зчитує байт до файлу |
void test(void) | Виконує перевірку роботоздатності |
Рисунок 1 Блок-схема підпрограми виконання команди WRITE_BYTE
Рисунок 2 Блок-схема підпрограми виконання команди RANDOM_READ
Рисунок 3 Блок-схема підпрограми виконання команди CUR_ADR_READ
5. Вибір середовища програмування та розробка програми
Для реалізації підпрограм та програми ми вибрали Borland C++, оскільки на мові C++ найпростіше напряму працювати з портами LPT порту. За алгоритмами, які наведені у попередньому пункту ми розробили діалогову програму, яка забезпечила можливість демонстрації команд читання та запису.
Висновок
В результаті виконання даного курсового проекту ми знайомилися з принципами роботи наступних команд мікросхеми AT24C32 : читання, запису даних. Розробили програму, яка забезпечила можливість демонстрації цих команд.
Список джерел інформації
1. Шилдт Г. Теория и практика С++. – СПб.: БХВ-Петербург, 1999. – 416с.
2. Шилдт Г. Самоучитель С++ . – СПб.: БХВ-Петербург, 2001. – 688с.
3. Microchip AT24C32. – USA: Microchip Technology Incorporated, 2008.
4. Шина I2C – Харьков Александр Торрес 1997
5. Описания элементов с шиной I2C, например даташиты I2C-EEPROM серии 24XXX фирмы Microchip (www.microchip.com)
Додаток А
Текст програми
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <stdlib.h>
#include <dos.h>
#include <iostream.h>
#define DATA 0x0378
#define STATUS DATA+1
#define CONTROL DATA+2
typedef unsigned char byte;
void write_byte(int device, int address, byte data);
byte read_random_data(int device, int address);
byte read_cur_adr(void);
void enter_adr(void);
void write_to_file(int adr);
void write_page(int device, int address, byte data);
void out_byte(byte o_byte);
byte in_byte(void);
byte ack(void);
byte nack(void);
void test(void);
void start(void);
void stop(void);
void low_SDA(void);
void high_SDA(void);
void low_SCL(void);
void high_SCL(void);
void main(void)
{
clrscr();
// test();
char c;
byte i_byte;
puts("Press 1 to write byte\nPress 2 to read all data\nPress 3 to read data from curent location\nPress 4 to write data to file\nPress ESC to exit program");
while(c!=27)
{
c=getch();
switch(c)
{
case '1':
{
enter_adr();
break;
}
case '2':
{
for(int adr=0x0000;adr<0x000f;adr++)
{
//write_byte(0x5, adr, 0x00);
i_byte=read_random_data(0x5,adr);
printf("\n %x", i_byte);
}
break;
}
case '3':
{
i_byte=read_cur_adr(); // read data from the same location and display it
printf("\nDATA IS %x\n", i_byte);
break;
}
case '4':
{
int adr;
puts("Enter adr\n");
cin>>adr;
write_to_file(adr);
break;
}
}
}
}
void test(void)
{
puts("Displaying testing of work.To cancel press any key");
while(!kbhit())
{
high_SDA();
delay(1000);
low_SDA();
high_SCL();
delay(1000);
low_SCL();
}
}
void write_page(int device, int address, byte data)//build
{
byte ack_bit;
start();
out_byte(0xA0 | (device<<1));
nack();
out_byte(address>>8);
nack();
out_byte(address&0xff);
nack();
start();
out_byte(0xA0 | (device<<1) | 0x01);
nack();
i_byte=in_byte();
nack();
stop();
return(i_byte);
}
void enter_adr(void)
{
byte dev=0x5;
int adr,val,n_val;
byte i_byte;
char *c;
char buf[12];
printf("Please enter adress in HEX\n");
cin>>adr;
printf("Please enter value to write in HEX\n");
cin>>val;
write_byte(dev,adr,val);
n_val=read_random_data(dev,adr);
printf("Value is %x on adress %x\n",n_val,adr);
puts("Insert text of no more then 12 symbols");
cin>>c;
for( int i=0;i<12;i++)
buf[i]=*(c+i);
for(i=0;i<12;i++)
printf("%c",buf[i]);
adr=0x00;
for( i=0;i<12;i++)
{
write_byte(dev,adr,buf[i]);
adr++;
}
adr=0x00;
for( i=0;i<12;i++)
{
i_byte=read_random_data(dev,adr);
printf("\n%c",i_byte);
adr++;
}
}
void write_byte(int device, int address, byte data)
{
byte ack_bit;
start();
out_byte(0xA0 | (device<<1));
nack();
out_byte(address>>8);
nack();
out_byte(address&0xff);
nack();
out_byte(data);
nack();
stop();
}
byte read_cur_adr(void)
/* read from specified address. return fetched data */
{
byte i_byte,ack_bit;
int device=0x5;
start(); /* start with no stop */
out_byte(0xA0 | (device<<1) | 0x1);
ack_bit=nack();
if(ack_bit==1)
{
printf("error_reading\n");
}
i_byte=in_byte(); /* fetch the byte */
nack();
stop();
return(i_byte);
}
void out_byte(byte o_byte)
/* shift out byte, beginning with most significant bit */
{
int n;
for(n=7; n>=0; n--)
{ /* note SCL is low during transitions on SDA */
if (((o_byte >>n) & 0x01) == 0)
{
low_SDA();
}
else
{
high_SDA();
}
else
{
high_SDA();
}
high_SCL();
low_SCL();
}
}
byte in_byte(void)
/* fetch byte, most significant byte first */
{
byte i_byte=0;
int n;
high_SDA();
for (n=0; n<8; n++)
{
high_SCL();
i_byte=(i_byte << 1) | (((inportb(STATUS)>>7)^0x01)&0x01);
/* note inversion on last significant bit of status! port ??? */
low_SCL();
}
return(i_byte);
}
/*byte ack(void)
{
byte ack_bit;
low_SDA();
high_SCL();
if ((((inportb(STATUS)>>7)^0x01)&0x01)==0)
{
ack_bit=0;
}
else
{
ack_bit=1;
}
low_SCL();
return(ack_bit);
} */
byte nack(void)
{
byte ack_bit;
high_SDA();
high_SCL();
if ((((inportb(STATUS)>>7)^0x01)&0x01)==0)
{
ack_bit=0;
}
else
{
ack_bit=1;
}
low_SCL();
// printf("\nACK = %x\n",ack_bit);
return(ack_bit);
}
void start(void)
/* bring SDA high to low while SCL is high */
{
high_SDA();
high_SCL();
low_SDA(); /* bring SDA low while clock is high */
low_SCL();
}
void stop(void)
/* bring SDA low to high while SCL is high */
{
low_SDA();
high_SCL();
high_SDA(); /* bring SDA high while clock is high */
low_SCL();
}
void low_SDA(void)
{
outportb(CONTROL, 0x00^0x01);
delay(5);
}
void high_SDA(void) /* makes output high impedance */
{
outportb(CONTROL, 0x01^0x01);
delay(5);
}
void low_SCL(void)
{
outportb(DATA, 0xE);
delay(5);
}
void high_SCL(void)
{
outportb(DATA, 0xF);
delay(5);
}
Додаток Б
Таблиця приєднання мікросхеми AT24C32 до порту LPT порту
Регістри та розряди LPT порту | Входи та виходи мікросхеми AT24C32 |
DR3-5 | живлення |
СR0 | вхід SDA |
DR0 | вхід SCL |
Схема електрична структурна
Схема електрична принципова