GIAO TiẾP SPI
GiỚI THIỆU
Giao tiếp SPI được thực hiện thông qua BUS 4 dây MISO, MOSI, SCK,
SS nên đôi khi SPI còn được gọi là giao thức giao tiếp 4 dây.
MISO: Master Input Slave Output
MOSI: Master Output Slave Input.
SCK : Serial Clock
SS : Slave Select
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
HOẠT ĐỘNG
Cả Master và Slave đều có thanh ghi dịch nối tiếp ở bên trong. Thiết bị
Master bắt đầu việc trao đổi dữ liệu bằng cách truyền đi một Byte vào
thanh ghi dịch của nó, sau đó Byte dữ liệu sẽ được đưa sang Slave theo
đường tín hiệu MOSI (SDI), Slave sẽ truyền dữ liệu nằm trong thanh ghi
dịch của chính nó ngược trở về Master thông qua đường tín hiệu MISO
(SDO). Bằng cách này, dữ liệu của hai thanh ghi sẽ được trao đổi với
nhau. Việc đọc và ghi dữ liệu vào Slave diễn ra cùng một lúc nên tốc độ
trao đổi dữ liệu diễn ra rất nhanh. Do đó, giao thức SPI là một giao thức
rất có hiệu quả
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
KẾT NỐI NHIỀU SLAVE
MASTER VÀ SLAVE ĐỘC LẬP
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
KiỂU DAISY-CHAINED
CÁC CHẾ ĐỘ HOẠT ĐỘNG
MODE 0: Xung dương, dữ liệu được chốt trước khi dịch
MODE1: Xung dương, dữ liệu được dịch đi trước khi chốt
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
CÁC CHẾ ĐỘ HOẠT ĐỘNG
MODE 2: Xung âm, dữ liệu được chốt trước khi dịch
MODE 3: Xung âm, dữ liệu được dịch đi trước khi chốt
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
LẬP TRÌNH
Mode 0:
char SPI_Transfer (char SPI_byte)
{
unsigned char i; // counter
for (i = 8; i> 0; i--)
{
MOSI = SPI_byte & 0x80;
SPI_byte = SPI_byte << 1;
SCK = 0x01;
SPI_byte |= MISO;
SCK = 0x00;
}
return (SPI_byte);
}
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
EEPROM 25Cxx
Đọc dữ liệu:
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
EEPROM 25Cxx
Ghi dữ liệu:
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
ĐỌC 1 BYTE VÀO 25Cxx
unsigned char EE_Read (unsigned Addr)
{
unsigned char data;
CS= 0; // chọn bộ nhớ
Delay_us(1); // tối thiểu 250ns (CS setup time)
data= SPI_Transfer(EE_READ); // truyền mã READ
data= SPI_Transfer((Addr & 0xFF00) >> 8); // truyền MSB của địa
chỉ
data= SPI_Transfer((Addr & 0x00FF)); // Truyền LSB của địa chỉ
data= SPI_Transfer(0x00);// Truyền dữ liệu giả
delay_us (1); // tối thiểu 250ns
CS= 1; // hủy chọn bộ nhớ
delay_us (1); // tối thiểu 500ns (CS disable time)
return data;
}
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
GHI 1 BYTE VÀO 25C04
void EE_Write (unsigned Addr, unsigned char value)
{
unsigned char data;
CS= 0;
delay_us (1);
data= SPI_Transfer(EE_WREN);
delay_us (1);
CS= 1;
delay_us (1);
CS= 0;
delay_us (1);
data = SPI_Transfer(EE_WRITE);
data = SPI_Transfer((Addr & 0xFF00) >> 8);
data = SPI_Transfer((Addr & 0x00FF));
data = SPI_Transfer(value);
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
GHI 1 BYTE VÀO 25C04
delay_us (1); //(CS hold time)
CS= 1;
do {
delay_us (1);
CS= 0; // select EEPROM to begin polling
delay_us (1);
data= SPI_Transfer(EE_RDSR);
data= SPI_Transfer(0x00);
delay_us (1);
CS= 1; // de-select EEPROM
} while (data& 0x01);
delay_us (1);
}
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng