📄 lab5_small.c
字号:
// Laborator PM 5 - Accesul la o memorie seriala (externa) prin interfata TWI
#include <util/twi.h>
#include <stdio.h>
#include <string.h>
#include "uart.h"
#define SLAVE_ADDRESS 0xA0 // adresa i2c a memoriei
// Functii pentru TWI /////////////////////////////////////////////////////////
uint8_t twst;
void twi_init(void)
{
TWSR = 0;
TWBR = (16000000UL / 100000UL - 16) / 2;
twst = 0;
}
// trimite un start condition
void twi_send_start(void)
{
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
}
// trimite un repeated start condition
void twi_send_rep_start(void)
{
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
}
// trimite un stop condition
void twi_send_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)| (1<<TWSTO);
}
// asteapta pana cand slave'ul reactioneaza
void twi_wait_transmit(void)
{
while( (TWCR & (1<<TWINT) ) == 0 ) // TODO - cand este gata interfata - vezi tutorial
{}
}
// porneste transmisia unui byte
void twi_start_transmit(void)
{
TWCR = (1<<TWINT) | (1<<TWEN); // TODO - vezi tutorial
}
// Functii pentru accesul la memoria EEPROM ///////////////////////////////////
// citeste len bytes de la adresa eeaddr si ii pune in buf
void eeprom_read( uint16_t eeaddr, uint8_t *buf )
{
uint8_t sla;
// bitii mairi in sla. transmisi tarziu
// + 1 eeadress bit (bitul de adresa A8 care nu incape in byte-ul urmator)
sla = SLAVE_ADDRESS | (((eeaddr >> 8) & 0x07) << 1);
// START
twi_send_start();
twi_wait_transmit();
// get TW_STATUS
////// Send HEADER_WRITE
TWDR = sla & ~(1); // TODO - headerul contine sla si bitul R/W = ?
twi_start_transmit();
twi_wait_transmit();
// get TW_STATUS
////// Send ADDRESA (A7, A6..... A0 )
TWDR = eeaddr;
twi_start_transmit();
twi_wait_transmit() ;
// get TW_STATUS
// START
twi_send_rep_start();
twi_wait_transmit();
// get TW_STATUS
////// Send HEADER_READ
TWDR = sla | 1; // TODO - headerul contine sla si bitul R/W = ?
twi_start_transmit();
twi_wait_transmit();
// get TW_STATUS
////// Get primul byte de date de la memorie
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWEA); // se trimite si Ack dupa receptie
twi_wait_transmit();
// get TW_STATUS
buf[0] = TWDR;
////// Get al doilea byte de date de la memorie
TWCR = (_BV(TWINT) | _BV(TWEN)) & (~(1<<TWEA)); // TODO - send NoACK la sfarsit
twi_wait_transmit();
// get TW_STATUS
buf[1] = TWDR;
// START
twi_send_stop();
}
// Main Function //////////////////////////////////////////////////////////////
int main(void)
{
char bytes[64];
twi_init();
eeprom_read( 0, (unsigned char*)bytes );
for(;;);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -