9dai

Dependencies:   mbed

Committer:
QUHP
Date:
Wed Sep 04 07:26:58 2013 +0000
Revision:
0:6cea25439069
for publish

Who changed what in which revision?

UserRevisionLine numberNew contents of line
QUHP 0:6cea25439069 1 /*
QUHP 0:6cea25439069 2 * pspad.c
QUHP 0:6cea25439069 3 *
QUHP 0:6cea25439069 4 * Created on: 2012/12/21
QUHP 0:6cea25439069 5 * Author: KORA
QUHP 0:6cea25439069 6 */
QUHP 0:6cea25439069 7
QUHP 0:6cea25439069 8 #include "mbed.h"
QUHP 0:6cea25439069 9 #include "pspad.h"
QUHP 0:6cea25439069 10
QUHP 0:6cea25439069 11 //----------------------------------------------------------
QUHP 0:6cea25439069 12 // PS PAD
QUHP 0:6cea25439069 13 //----------------------------------------------------------
QUHP 0:6cea25439069 14 #define PS_DAT datpin // こいつだけ要プルアップ
QUHP 0:6cea25439069 15 #define PS_CMD_H cmdpin = 1
QUHP 0:6cea25439069 16 #define PS_CMD_L cmdpin = 0
QUHP 0:6cea25439069 17 #define PS_SEL_H selpin = 1
QUHP 0:6cea25439069 18 #define PS_SEL_L selpin = 0
QUHP 0:6cea25439069 19 #define PS_CLK_H clkpin = 1
QUHP 0:6cea25439069 20 #define PS_CLK_L clkpin = 0
QUHP 0:6cea25439069 21
QUHP 0:6cea25439069 22 //----------------------------------------------------------
QUHP 0:6cea25439069 23 // 動作周波数
QUHP 0:6cea25439069 24 //----------------------------------------------------------
QUHP 0:6cea25439069 25 #define PS_FREQ 125 // パッドの動作周波数 (kHz)
QUHP 0:6cea25439069 26 // タイマはこの2倍の周波数で動かす
QUHP 0:6cea25439069 27 // 本来250kHzだが変更しても問題ない
QUHP 0:6cea25439069 28
QUHP 0:6cea25439069 29 #define TM_PERI (500/PS_FREQ) // タイマの1クロックに要する時間(us)
QUHP 0:6cea25439069 30 // タイマの2クロックをパッドの1クロックとしている
QUHP 0:6cea25439069 31
QUHP 0:6cea25439069 32 //----------------------------------------------------------
QUHP 0:6cea25439069 33 // constructor
QUHP 0:6cea25439069 34 //----------------------------------------------------------
QUHP 0:6cea25439069 35 Pspad::Pspad(PinName dat, PinName cmd, PinName sel, PinName clk) : datpin(dat), cmdpin(cmd), selpin(sel), clkpin(clk)
QUHP 0:6cea25439069 36 {
QUHP 0:6cea25439069 37 // GPIOの出力値を設定する
QUHP 0:6cea25439069 38 PS_CMD_H; // CMD を1に
QUHP 0:6cea25439069 39 PS_CLK_H; // CLK を1に
QUHP 0:6cea25439069 40 PS_SEL_H; // SEL を1に
QUHP 0:6cea25439069 41
QUHP 0:6cea25439069 42 // タイマの設定
QUHP 0:6cea25439069 43 tm.reset();
QUHP 0:6cea25439069 44 }
QUHP 0:6cea25439069 45
QUHP 0:6cea25439069 46 //----------------------------------------------------------
QUHP 0:6cea25439069 47 // プレステ用ゲームパッドとの1バイトの通信
QUHP 0:6cea25439069 48 // 引数
QUHP 0:6cea25439069 49 // int send : 送信データ(0~255)
QUHP 0:6cea25439069 50 // 戻り値
QUHP 0:6cea25439069 51 // int 受信データ(0~255)
QUHP 0:6cea25439069 52 //----------------------------------------------------------
QUHP 0:6cea25439069 53 uint8_t Pspad::PsComm( uint8_t send_data )
QUHP 0:6cea25439069 54 {
QUHP 0:6cea25439069 55 uint8_t i;
QUHP 0:6cea25439069 56 uint8_t recv_data = 0;
QUHP 0:6cea25439069 57
QUHP 0:6cea25439069 58 // カウント開始
QUHP 0:6cea25439069 59 tm.start();
QUHP 0:6cea25439069 60
QUHP 0:6cea25439069 61 for(i=0; i<8; i++)
QUHP 0:6cea25439069 62 {
QUHP 0:6cea25439069 63
QUHP 0:6cea25439069 64 // 送信データ
QUHP 0:6cea25439069 65 if(send_data & 0x01){
QUHP 0:6cea25439069 66 PS_CMD_H;
QUHP 0:6cea25439069 67 }else{
QUHP 0:6cea25439069 68 PS_CMD_L;
QUHP 0:6cea25439069 69 }
QUHP 0:6cea25439069 70 // クロックをLOWに
QUHP 0:6cea25439069 71 PS_CLK_L;
QUHP 0:6cea25439069 72 // 待機
QUHP 0:6cea25439069 73 while(tm.read_us()/TM_PERI <= 2*i);
QUHP 0:6cea25439069 74
QUHP 0:6cea25439069 75 // クロックをHIGHに
QUHP 0:6cea25439069 76 PS_CLK_H;
QUHP 0:6cea25439069 77 // 受信データ
QUHP 0:6cea25439069 78 recv_data |= (PS_DAT<<i);
QUHP 0:6cea25439069 79 // 待機
QUHP 0:6cea25439069 80 while(tm.read_us()/TM_PERI <= 2*i+1);
QUHP 0:6cea25439069 81
QUHP 0:6cea25439069 82 // 送信データを1ビットずらす
QUHP 0:6cea25439069 83 send_data >>= 1;
QUHP 0:6cea25439069 84 }
QUHP 0:6cea25439069 85
QUHP 0:6cea25439069 86 // CMDをHIGHに戻す
QUHP 0:6cea25439069 87 PS_CMD_H;
QUHP 0:6cea25439069 88
QUHP 0:6cea25439069 89 // 5クロックほど待機
QUHP 0:6cea25439069 90 while(tm.read_us()/TM_PERI <= 2*8+2*5);
QUHP 0:6cea25439069 91
QUHP 0:6cea25439069 92 // カウント停止 及び リセット
QUHP 0:6cea25439069 93 tm.stop();
QUHP 0:6cea25439069 94 tm.reset();
QUHP 0:6cea25439069 95
QUHP 0:6cea25439069 96 return recv_data;
QUHP 0:6cea25439069 97 }
QUHP 0:6cea25439069 98
QUHP 0:6cea25439069 99 //----------------------------------------------------------
QUHP 0:6cea25439069 100 // プレステ用ゲームパッドからのデータの取得
QUHP 0:6cea25439069 101 // 変数
QUHP 0:6cea25439069 102 // uint32_t key ボタンの押下状態をbitmapで返す。
QUHP 0:6cea25439069 103 // int8_t right_x -128~127 の値を返す。アナログスティック中立時は0
QUHP 0:6cea25439069 104 // int8_t right_y -128~127 の値を返す。アナログスティック中立時は0
QUHP 0:6cea25439069 105 // int8_t left_x -128~127 の値を返す。アナログスティック中立時は0
QUHP 0:6cea25439069 106 // int8_t left_y -128~127 の値を返す。アナログスティック中立時は0
QUHP 0:6cea25439069 107 //----------------------------------------------------------
QUHP 0:6cea25439069 108 void Pspad::PsRead(void)
QUHP 0:6cea25439069 109 {
QUHP 0:6cea25439069 110 uint8_t i, len;
QUHP 0:6cea25439069 111 uint8_t rcv[20];
QUHP 0:6cea25439069 112
QUHP 0:6cea25439069 113 key = 0;
QUHP 0:6cea25439069 114 right_x = 0; // アナログスティック中立
QUHP 0:6cea25439069 115 right_y = 0; // アナログスティック中立
QUHP 0:6cea25439069 116 left_x = 0; // アナログスティック中立
QUHP 0:6cea25439069 117 left_y = 0; // アナログスティック中立
QUHP 0:6cea25439069 118
QUHP 0:6cea25439069 119 // SELをLOWに
QUHP 0:6cea25439069 120 PS_SEL_L;
QUHP 0:6cea25439069 121
QUHP 0:6cea25439069 122 // 少し待機
QUHP 0:6cea25439069 123 tm.start();
QUHP 0:6cea25439069 124 while(tm.read_us() <= 40); // 40usでも動く模様
QUHP 0:6cea25439069 125 tm.stop();
QUHP 0:6cea25439069 126 tm.reset();
QUHP 0:6cea25439069 127
QUHP 0:6cea25439069 128 // 通信開始
QUHP 0:6cea25439069 129 rcv[0] = PsComm(0x01); // PADはコマンド'01h'を検出して動作を開始する
QUHP 0:6cea25439069 130 rcv[1] = PsComm(0x42); // 受信データの下位4ビットが転送バイト数の半分の数を表す
QUHP 0:6cea25439069 131 len = (rcv[1] & 0x03) * 2; // 転送バイト数を求める
QUHP 0:6cea25439069 132 for(i=0;i<len+1;i++){
QUHP 0:6cea25439069 133 rcv[i+2] = PsComm(0x00); // PADの状態を受信
QUHP 0:6cea25439069 134 }
QUHP 0:6cea25439069 135
QUHP 0:6cea25439069 136 // SELをHIGHに
QUHP 0:6cea25439069 137 PS_SEL_H;
QUHP 0:6cea25439069 138
QUHP 0:6cea25439069 139 // PADの状態を返す
QUHP 0:6cea25439069 140
QUHP 0:6cea25439069 141 key = ((rcv[3]<<8) | rcv[4]) ^ 0xFFFF;
QUHP 0:6cea25439069 142 if(len >= 6){
QUHP 0:6cea25439069 143 right_x = rcv[5] - 128;
QUHP 0:6cea25439069 144 right_y = rcv[6] - 128;
QUHP 0:6cea25439069 145 left_x = rcv[7] - 128;
QUHP 0:6cea25439069 146 left_y = rcv[8] - 128;
QUHP 0:6cea25439069 147 }
QUHP 0:6cea25439069 148 }
QUHP 0:6cea25439069 149