2017-05-19 17 views
0

Willkommen. Seit einigen Tagen versuche ich die richtige Antwort vom PS2 PAD auf dem STM32F411RE Nukleo zu bekommen. Ich verwende SPI und USART, um Nachrichten zu empfangen. Die Taktfrequenz ist auf 8 MHz eingestellt, in SPI Prescaler 64 Konfiguration, die mir 125KHz (oder KBits/s) gibt. Das erste Bit wird von LSB, CPOL-Parameter von 1 und CPHA von 2 genommen. NSS-Software gesteuert, auf GPIO-Ausgang gesetzt (PA4-CS-Pin). Ich verwende PA5-Pins als SCK (Takt) PA6-MISO, PA7-MOSI. SPI ist auf Vollduplex-Mastermodus eingestellt. (USART asynchron und 9600Bits/s aber es ist nur für den Empfang von Nachrichten auf einem PC). Ich würde hinzufügen, dass der Mikrocontroller in der HAL-Bibliothek arbeitet. In der main.c Datei:STM32 F411RE Nucleo SPI Unterstützung und Programmierung PlayStation2 Controller

#define CS_LOW HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET) 
#define CS_HIGH HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET) 

CS LOW - stellt die Linie "attetion" in den Zustand 0 und CS_HIGH den Zustand 1 Functinon Senden von Befehls- und Datenrück (MISO-MOSI):

uint8_t PS2_RWByte(uint8_t komenda, uint8_t tablica, int wielkosc) 
    { 
    HAL_SPI_Transmit(&hspi1, &komenda, sizeof(komenda), 1); 
    HAL_SPI_Receive(&hspi1, &tablica, sizeof(tablica), 1); 
    return(tablica); 
    } 

Funktion ein Byte-String zu senden:

uint8_t Get_PS2Dat(uint8_t buf[]) 
{ 
    CS_LOW; 
    HAL_Delay(15/1000); 
    buf[0]=PS2_RWByte(0x01, buf[0], 8);HAL_Delay(15/1000); 
    buf[1]=PS2_RWByte(0x42, buf[1], 8);HAL_Delay(15/1000); 
    buf[2]=PS2_RWByte(0x00, buf[2], 8);HAL_Delay(15/1000); 
    buf[3]=PS2_RWByte(0x00, buf[3], 8);HAL_Delay(15/1000); 
    buf[4]=PS2_RWByte(0x00, buf[4], 8);HAL_Delay(15/1000); 
    buf[5]=PS2_RWByte(0x00, buf[5], 8);HAL_Delay(15/1000); 
    buf[6]=PS2_RWByte(0x00, buf[6], 8);HAL_Delay(15/1000); 
    buf[7]=PS2_RWByte(0x00, buf[7], 8);HAL_Delay(15/1000); 
    buf[8]=PS2_RWByte(0x00, buf[8], 8);HAL_Delay(15/1000); 
    CS_HIGH; 
    if((buf[0]==0xff)&&(buf[1]==0x41)&&(buf[2]==0x5a)) 
    return 1; 
    if((buf[0]==0xff)&&(buf[1]==0x73)&&(buf[2]==0x5a)) 
    return 2; 
    return 0; 
    } 

In Hauptfunktion:

int main(void){ 
HAL_Init(); 
SystemClock_Config(); 
MX_GPIO_Init(); 
MX_USART2_UART_Init(); 
MX_SPI1_Init(); 
HAL_SPI_MspInit(&hspi1); 
uint8_t PS2buf[10]={0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 
uint8_t wyswietl[30]={0}; 
while (1) 
{Get_PS2Dat(PS2buf); 
    for(int i=0;i<9;i++) 
    { 
    sprintf(wyswietl,"%u ,",PS2buf[i]); 
    HAL_UART_Transmit(&huart2,wyswietl,30,250); 
    } 
sprintf(wyswietl,"\n\r"); 
HAL_UART_Transmit(&huart2,wyswietl,30,250); 
HAL_Delay(300); 
} 
} 

Nach dem Senden der Informationen: 0x01 0x42 0x00 0x00 0x00 Ich sollte 0xFF 0x41 0x5A 0xFF 0xFF erhalten, wenn keine Taste gedrückt wird. Bei 3 und 4 Bytes sollten Informationen über die gedrückten Tasten erscheinen, während ich solche Werte erhalte: 65, 255, 255, 255, 255 dh 0xFF 0xFF 0xFF 0xFF 0xFF. Es ist seltsam, wie das zweite gesendete Byte dem ersten empfangenen entspricht. Der zusätzliche Punkt ist, dass wenn Sie die Taste "mode" drücken, der Wert 65 auf 115 (0x73) wechselt, während andere unverändert bleiben. I Link zur Verfügung stellen unterstützen Seite:

PlayStation 2 Controller Interface

Ich werde auch hinzufügen, dass genau diese PAD:

Link to page

Vielleicht hat jemand kommt mit etwas Idee. Bitte hilf mir. :)

Antwort

0

Ian nicht vertraut mit PS2-Pad, aber ich glaube, Sie müssen den NSS-Pin zurück auf High nach Ihrem Spi-Empfang setzen. (Sie müssen also vor jeder einzelnen Schreiboperation auch auf Niedrig setzen.)

2

Sie sollten HAL_SPI_TransmitReceive anstelle einer Kombination aus HAL_SPI_Transmit und HAL_SPI_Receive verwenden.

  • Die Funktion HAL_SPI_Transmit sendet nur Daten und lässt eingehende Bytes aus.
  • Die Funktion HAL_SPI_Receive sendet Dummy-Daten und ruft eingehende Bytes ab.

Also was Sie erhalten ist jedes zweite Zeichen. 65 = 0x42 ist das zweite Zeichen. Da Sie beim Empfang von Daten ein Dummy-Byte senden, wird die verbleibende Nachricht vom PS2-Controller nicht verstanden, sodass Sie 0xFF erhalten.

Ihre PS2_RWByte Funktion wie das Ändern und es sollte funktionieren:

uint8_t PS2_RWByte(uint8_t komenda, uint8_t tablica, int wielkosc) 
{ 
    HAL_SPI_TransmitReceive(&hspi1, &komenda, &tablica, sizeof(uint8_t), 1); 
    return(tablica); 
} 
+0

Vielen Dank! Es funktioniert jetzt gut! – cuando123