- 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/
根据文档,“|”可用于创建匹配任一由“|”分隔的模式的正则表达式。 我正在尝试使用以下内容来查看 moves 是否包含与“UP”“DOWN”“LEFT”“RIGHT”之一匹配的字符串: moves =
这个问题在这里已经有了答案: What is the difference between re.search and re.match? (8 个回答) 1年前关闭。 来自 regex docs它说
谁能告诉我是否可以组合像 re.IGNORECASE 这样的标志, re.MULTILINE和 re.DOTALL正则表达式匹配? r = re.compile(regex, re.IGNORECAS
这个问题在这里已经有了答案: Python re.sub with a flag does not replace all occurrences (3 个答案) 关闭 6 年前。 为什么这符合预期
提前致谢。我的问题是: 我有一段 Python 代码,我在其中尝试使用“os.walk,re and re.findall ip”来尝试在多个文件中查找所有 ip 地址,例如: file1:192.1
在演示 Python 的正则表达式功能时,我编写了一个小程序来比较 re.search()、re.findall() 和 re 的返回值.finditer()。我知道 re.search() 每行只会
我有一台运行 Lion 和 Python 2.7.1 的 Mac。我注意到 re 模块中有一些非常奇怪的东西。如果我运行以下行: print re.split(r'\s*,\s*', 'a, b,\n
在 python 中,re.search() 检查字符串中任何位置的匹配项(这是 Perl 默认执行的操作)。 那么,为什么我们不像在 Ex(2) 中那样在 Ex(1) 中得到 'ABBbbb' 的输
我正在尝试从存储在光盘上的 HTML 文档中创建单词列表。当我尝试拆分单词并将它们添加到我的单词向量中时,我最终陷入了困惑。 def get_word_vector(self): line =
所以我尝试只打印月份,当我使用时: regex = r'([a-z]+) \d+' re.findall(regex, 'june 15') 它打印:六月但是当我尝试对这样的列表执行相同操作时: re
我正在学习 Python 的正则表达式。下面有两个略有不同的 re.search() 函数。唯一的区别是我在'}'之前添加了一个空格。任何人都可以解释导致结果差异的原因吗?谢谢! 我的代码: impo
我被难住了。我正在编写 Python 3.6.2,使用 PyCharm 作为我的 IDE。以下脚本片段说明了我的问题: def dosubst(m): return m.group() + "
这个问题在这里已经有了答案: Python re.search (2 个答案) 关闭 9 年前。 我正在尝试从 Hackerrank 的问题中解决这个问题。这是一个机器学习问题。最初,我试图从语料库
请解释一下为什么使用 re.find 和 re.sub 会得到不同的结果 我解析的字符串: GRANT USAGE ON *.* TO 'testuser'@'10.10.10.10' IDENTIF
为什么re.match返回的是None对象,而类似的re.findall返回的是非空结果? 我正在解析电子邮件主题。有问题的是 subject = "=?UTF-8?B?0JLQsNGI0LUg0YH
问题第 1 部分 我得到了这个文件 f1: George Washington Joe Taylor 我想重新编译它,它看起来像这样 f1:(带空格) George Washington Joe
python正则表达式模块简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的
我的字符串看起来像“Billboard Bill SpA”。我想要一个删除 SpA 的正则表达式,但前提是它前面有一个大写单词。我使用的正则表达式是“[A-Z][a-z]*\s(SpA)”。如果我使用
我有一个 str,我想获取单引号内的子字符串 ('): line = "This is a 'car' which has a 'person' in it!" 所以我用了: name = re.fi
这个问题在这里已经有了答案: Difference between regular expression modifiers (or flags) 'm' and 's'? (3 个答案) Pyth
我是一名优秀的程序员,十分优秀!