cdtdongnhat _ ket noi dam me cdtdongnhat _ ket noi dam me cdtdongnhat _ ket noi dam me cdtdongnhat _ ket noi dam me
1 2 3 4

Thứ Tư, 21 tháng 10, 2015

Giao tiếp SPI với gamepad

Để chuẩn bị cho robocon sắp tới. Mình sẽ hướng dẫn sơ qua cách giao tiếp tay game PS2 vs vdk 16f877 theo chuẩn SPI.Các bạn cùng tham khảo



1.Hình ảnh tay game:


2.Các chân giao tiếp của tay game:



Đối với điều khiển robôcn, ta dùng các dây sau: Clock, Data, Command, VCC & GND, Attention.

Clock,Data,Command,Attention nối với các chân I/O bất kỳ. Chân Data nên được kéo nguồn bằng điện trở từ 4,7k hoặc 10k.

Giao tiếp theo chuẩn SPI:
Clock: xung, đồng bộ hóa quá trình truyền dữ liệu.
Data: dữ liệu từ gamepad về vdk;
Command: dữ liệu từ vdk đến gamepad.
Attention: Chip select 

VCC: 3-5V; GND:mass.

3. Cách truyền nhận dữ liệu:

Tay game và vi điều khiển truyền và nhận từng byte dữ liệu cùng 1 lúc bằng giao tiếp nối tiếp.

Xung Clock được giữ ở mức cao cho đến khi bắt đầu gửi 1byte. Sau đó, Clock 
sẽ được đưa xuống mức thấp để bắt đầu quá trình truyền và nhận dữ liệu 
trong thời gian 8 xung Clock. Ở vị trí xung Clock ở cạnh xuống, dữ liệu 
trên đường truyền thay đổi. Khi xung Clock ở cạnh lên, dữ liệu được đọc.
Byte có trọng số thấp nhất được truyền trước.

Chân ATT tích 0: cho phép chip trong tay game truyền hoặc nhận dữ liệu
Chân ATT tích 1: ngừng quá trình làm việc

4. Các bước:

Bước 1: Vdk gửi 0x01
Bước 2: Vdk gửi 0x42
Bước 3: Vdk gửi 0x00;
Bước 4: Vdk nhận byte thứ 4 (UP,DOWN,RIGHT,LEFT,START,SELECT)
Bước 5: Vdk nhận byte thứ 5 (|_|, O , X , /\ , R1,R2,L1,L2)
Bước 6: Vdk nhận byte thứ 6: Analog bên phải 0x00 = Left 0xFF = Right
Bước 7: Vdk nhận byte thứ 7: Analog bên phải 0x00 = Up 0xFF = Down
Bước 8: Vdk nhận byte thứ 8: Analog bên trái 0x00 = Left 0xFF = Right
Bước 9: Vdk nhận byte thứ 9: Analog bên trái 0x00 = Up 0xFF = Down


Các hàm cơ bản trong giao tiếp:

Hàm truyền nhận byte



unsigned char access(unsigned char tbyte)
{
     unsigned char rbyte=0;
   unsigned int j;
   CLK=1;
   for(j=0;j<8;j++)
   {
      CMD=tbyte&0x01;
      delay_us(5);
      CLK=0;
      delay_us(5);
      rbyte=(rbyte>>1)|(DATA<<7); //nhan bit cao truoc
      CLK=1;
      tbyte=tbyte>>1;
   }
   delay_us(5);
   return rbyte;
   CLK=1;
}
code đầy đủ:
//-------CODE GAME PS2 BY DONGNHATCDT--------//
#include <main.h>
#include <lcd1.h>
#define ATT rb2
#define DATA rc5
#define CMD rc4
#define CLK RC3
unsigned char byte4,byte5,byte6,byte7,byte8,byte9,analog;
unsigned char access(unsigned char tbyte)
{
   unsigned char rbyte=0;
   unsigned int j;
   CLK=1;
   for(j=0;j<8;j++)
   {
      CMD=tbyte&0x01;
      delay_us(5);
      CLK=0;
      delay_us(5);
      rbyte=(rbyte>>1)|(DATA<<7); //nhan bit cao truoc
      CLK=1;
      tbyte=tbyte>>1;
   }
   delay_us(5);
   return rbyte;
   CLK=1;
}
void gamepad()
{
   ATT = 1; //ko cho chip slave hoat dong
   ATT=0; //cho slave hoat dong
   access(0x01);
   analog=access(0x42);
   access(0);
   byte4=access(0);
   byte5=access(0);
   byte6=access(0);
   byte7=access(0);
    byte8=access(0);
   byte9=access(0);
  
   ATT=1;
} 
void main()
{  
   SET_TRIS_D(0);
   SET_TRIS_B(0);
   DDRDATA = DDRIN;
   DDRCMD = DDROUT;
   DDRSCK = DDROUT;
  int8 str[16];
  lcd_inits(); //khoi tao lcd
   lcd_gotoxy(0,1);
   sprintf(str,"4=");
   lcd_putschar(str);
   lcd_gotoxy(0,2);
   sprintf(str,"5=");
   lcd_putschar(str);
  
  while(1)
  {
        gamepad();
       lcd_gotoxy(2,1);
       sprintf(str,"%3.0u",byte4);
       lcd_putschar(str);
        lcd_gotoxy(2,2);
       sprintf(str,"%3.0u",byte5);
       lcd_putschar(str);
       lcd_gotoxy(7,1);
       sprintf(str,"%3.0u",byte6);
       lcd_putschar(str);
        lcd_gotoxy(7,2);
       sprintf(str,"%3.0u",byte7);
       lcd_putschar(str);
       lcd_gotoxy(13,1);
       sprintf(str,"%3.0u",byte8);
       lcd_putschar(str);
        lcd_gotoxy(13,2);
       sprintf(str,"%3.0u",byte9);
       lcd_putschar(str);
  }
}

1 nhận xét: