- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
几天来,我一直试图从 PS2 中获得正确答案STM32F411RE 上的游戏 handle (DualShock 2)Nucleo .
我使用 SPI和 USART接收消息。时钟频率设置为 8 MHz,SPI 预分频器设置为 64 配置,这为我提供了 125 kHz (kbit/s)。
第一位取自LSB ,CPOL 参数为 1,CPHA 为 2。它由 NSS 软件控制,设置为 GPIO 输出(PA4-CS 引脚)。我使用 PA5 引脚作为 SCK(时钟)PA6-MISO、PA7-MOSI。 SPI 设置为全双工主机模式。 (USART 异步和 9600 位/秒,但它仅用于在 PC 上接收消息)。
微 Controller 运行一个 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 - 将线路“注意”设置为状态 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;
}
在 main 函数中:
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),而其他值保持不变。
最佳答案
您应该使用 HAL_SPI_TransmitReceive 而不是 HAL_SPI_Transmit 和 HAL_SPI_Receive 的组合。
基本上,您每隔一个字符就会收到一次。65 = 0x42 是第二个字符。因为您在接收数据时发送了一个虚拟字节,所以剩余的消息不被 PS2 Controller 理解,所以您得到 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);
}
关于c - STM32 F411RE Nucleo SPI 支持和编程 PlayStation 2 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44078941/
我的定时器 TIM3 上的正交编码器模式有问题 STM32F446RE/ NUCLEO-F446RE : TIM3 在第一个信号的每个上升沿计数。CNT 寄存器计数,我以 1 Hz 读取该值,然后我将
当我将其加载到板上时,会得到未发现外围错误的引脚图。 我对此问题(One of the pages I visited)进行了一些研究,我认为我理解了这个问题, 但是,我使用的所有引脚都完全支持我要它
编辑: 解决方案是调低初始化 block 中的 I2C 时钟。尽管 STM 可以处理它,但 LCD 的数据表表明它只能处理高达 10kHz 的频率。 对于 DMA,必须在 CubeMX 软件中启用和设
我正在使用 STM32F401RE 从压力传感器采样数据。使用此函数,我可以使用 printf() 使用“Tera Term”在终端上打印数据。 int _write(int file, char *
我最近买了一个 STM-NUCLEO我正在尝试写入连接到 LED 的 PA0、PA1、PA2、PA3。连接到 PA0 和 PA1 的 LED 按预期点亮,但 PA2 和 PA3 没有。我用 PA4 试
我是整个stm32环境的新手。我过去一直使用 arduino,我想为这个项目尝试一些新东西。 我很难在 nucleo 板(MASTER)和 arduino(SLAVE)之间建立 i2c 连接。 我已经
我正在使用 arm-none-eabi 工具链为 Nucleo 创建二进制文件,然后使用它提供的 USB 虚拟存储设备将其闪存到 Nucleo。 我正在用 -ggdb 编译程序。但是我怎么可能连接到
我正在寻找一个命令行工具来在 ubuntu 中刷新我的 NUCLEO 卡。我想要这个工具使用 node.js 远程刷新我的 NUCLEO。我已经尝试过 st-flash 和 stm32flash 但这
我正在尝试通过 i2c 读取加速度计数据。加速度计的i2c地址为0x19用于读取,0x18用于写入。为了检查与加速度计的通信是否正确,我应该读取寄存器 0x00,并且它必须返回 0x12 作为结果
我尝试在 NUCLEO-F746ZG 上创建一个 UDP 回显服务器,但是当我启动客户端时,我的主板只给出一个答案。 这是我的线程代码: static void udpecho_thread(void
我正在尝试弄清楚如何切换 Nucleo 板上的 LED,但我只是看不到用户 LED 切换。在线查看似乎这就是您所要做的。有没有其他人遇到过这个问题? #include "stm32f4xx.h" #i
我正在尝试通过 STM32CubeIDE 仅使用寄存器来打开 nucleo 板内的 LED(原理图中的 LD2)。 用户手册声明了时钟、模式和数据寄存器的以下地址: Led pin: PA5 Addr
STM32F401RE --> CortexM4我使用 SPI1 和 HAL 低级驱动程序 STM32CubeF4。我使用了以下 SPI 配置:- SPI_HandleTypeDef hspi; hs
我可以使用 mbed 在线 IDE 从 Windows-7 成功编译并运行 LED 闪烁示例,该 IDE 在我的 NUCLEO F091C 板上运行。 如何实现 printf? 有一个输出到串行的示例
我正在尝试编写一个裸机程序来闪烁绿色 LED。事实上,我无法打开或关闭任何 LED。这是一个现成的板。主板名称为 NUCLEO F429ZI。 Board Image 我已经浏览了原理图,并且确信引脚
我想使用Nucleo L053R8的crc计算单元计算3字节的CRC值。生成多项式如下:g(X)=x^24 + x^10 + x^9 + x^6 + x^4 + x^3 + x + 1 看来使用这个C
我想在STM32(Nucleo-F401RE)上使用DMA配置ADC,并通过SPI将值传输到Basys 3 FPGA。在通过SPI传输之前,当我使用STMSTudio实时读取内存中的值时,它是不稳定的
我希望这是对我的问题的清晰解释,我已经在各种手册上跑了一个多星期了,现在正在尝试解决这个问题: 最近,在 STM32 Nucleo-F334R8 上进行反馈和测试后,我一直在为一个类(class)项目
我将 Flir Lepton 相机连接到了我的主板上,并且借助 ThermalView 程序(源代码:https://github.com/groupgets/LeptonModule/tree/ma
uint32_t PAGEError = 0; FLASH_EraseInitTypeDef EraseInitStruct; EraseInitStruct.TypeErase = FLASH_
我是一名优秀的程序员,十分优秀!