Kod: Zaznacz cały
#include "macros.h"
#include <avr/io.h>
#include "rs232.h"
#define SLE4428_PORT PORTC
#define SLE4428_PIN PINC
#define SLE4428_DDR DDRC
#define SLE4428_CLK 7
#define SLE4428_IO 6
#define SLE4428_RST 5
#define SLE4428_WRITE() {SLE4428_DDR |= (1<<SLE4428_IO);}
#define SLE4428_READ() {SLE4428_DDR &= ~(1<<SLE4428_IO);}
#define SLE4428_CMD_WRITE_PB 0x31
#define SLE4428_CMD_WRITE_EC 0x32
#define SLE4428_CMD_WRITE 0x33
#define SLE4428_CMD_READ_PB 0x0C
#define SLE4428_CMD_READ 0x0E
void sle4428_init(void)
{
SLE4428_DDR |= (1<<SLE4428_CLK) | (1<<SLE4428_RST) | (1<<SLE4428_IO); // ustaw CLK, RST, IO jako wyjścia
//reset
LOW(SLE4428_PORT,SLE4428_RST)
LOW(SLE4428_PORT,SLE4428_CLK)
_delay_us(6);
HIGH(SLE4428_PORT,SLE4428_RST)
_delay_us(8);
HIGH(SLE4428_PORT,SLE4428_CLK)
_delay_us(12);
LOW(SLE4428_PORT,SLE4428_CLK)
_delay_us(8);
LOW(SLE4428_PORT,SLE4428_RST) // tryb danych
SLE4428_READ() // odczyt - IO jako wejście
_delay_us(10);
//odczyt atr karty
for(int i=0; i<32; i++)
{
HIGH(SLE4428_PORT,SLE4428_CLK) //zegar w górę
_delay_us(4);
if(SLE4428_PIN & (1<<SLE4428_IO)) // odczytaj bit
rs232_putc('1');
else
rs232_putc('0');
_delay_us(12);
HIGH(SLE4428_PORT,SLE4428_CLK) // zegar w dół
_delay_us(12);
}
rs232_puts("\n");
}Linię I/O mam podciągniętą do +5 zewnętrzym rezystorem.
Podczas wywołanie tej procedury jako atr dostaję same jedynki.
Tak jak by karta nie odpowiadała.
Może ktoś mi coś poradzi.