0

欢迎。几天来,我试图从 STM32F411RE 核上的 PS2 PAD 获得正确答案。我使用 SPI 和 USART 来接收消息。时钟频率设置为 8MHz,在 SPI 预分频器 64 配置中为我提供 125KHz(或 KBits / s)。第一位取自 LSB,CPOL 参数为 1,CPHA 为 2。NSS 软件控制,设置为 GPIO 输出(PA4-CS 引脚)。我使用 PA5 引脚作为 SCK(时钟)PA6-MISO、PA7-MOSI。SPI 设置为全双工主模式。(USART 异步和 9600Bits / s 但它只是用于在 PC 上接收消息)。我要补充一点,微控制器在 HAL 库中运行。在 main.c 文件中:

#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 - 将“attetion”行设置为状态 0,将 CS_HIGH 设置为状态 1。功能发送命令和返回数据(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);
   }

发送字节串的函数:

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;
   }

在主要功能中:

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);
 }
 }

发送信息后: 0x01 0x42 0x00 0x00 0x00 如果没有按下按钮,我应该得到 0xFF 0x41 0x5A 0xFF 0xFF。当我得到这样的值时,应该在 3 和 4 字节出现有关按下的键的信息:65、255、255、255、255 即 0xFF 0xFF 0xFF 0xFF 0xFF。奇怪的是,第二个发送的字节对应于第一个接收的字节。另外一点是,如果您按下“模式”键,值 65 将更改为 115 (0x73),而其他值仍保持不变。我提供支持页面的链接:

PlayStation 2 控制器接口

我还要补充一点,这正是这个 PAD:

链接到页面

也许有人想出了一些主意。请帮我。:)

4

2 回答 2

2

您应该使用 HAL_SPI_TransmitReceive 而不是 HAL_SPI_Transmit 和 HAL_SPI_Receive 的组合。

  • 函数 HAL_SPI_Transmit 仅发送数据并忽略传入字节。
  • 函数 HAL_SPI_Receive 发送虚拟数据并获取传入字节。

所以基本上你收到的是每隔一个字符。65 = 0x42 是第二个字符。因为您在接收数据时发送了一个虚拟字节,所以 ps2 控制器不理解剩余的消息,因此您得到 0xFF。

像这样更改您的 PS2_RWByte 函数,它应该可以工作:

uint8_t PS2_RWByte(uint8_t komenda, uint8_t tablica, int wielkosc)
{
  HAL_SPI_TransmitReceive(&hspi1, &komenda, &tablica, sizeof(uint8_t), 1);
  return(tablica);
}
于 2017-05-22T05:38:35.600 回答
0

Ian 不熟悉 ps2 pad ,但我相信您必须在 spi-receive 之后将 NSS 引脚设置回高电平。(所以你还需要在每次写作之前设置为低……)

于 2017-05-20T01:35:21.573 回答