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:
Vielleicht hat jemand kommt mit etwas Idee. Bitte hilf mir. :)
Vielen Dank! Es funktioniert jetzt gut! – cuando123