欢迎。几天来,我试图从 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),而其他值仍保持不变。我提供支持页面的链接:
我还要补充一点,这正是这个 PAD:
也许有人想出了一些主意。请帮我。:)