188610329 发表于 2022-10-12 12:49 我都在一个板上,距离很近。我将速度降低,设置为:SPI_BaudRatePrescaler_256。今天试了一天,还是连接不上,前两天还好好的。现在将数值写入,读出来全是0xFF。还有没有其他可能?这个我的初始化代码。 void SPIx_I2Cx_GPIOs_Init(void* bus_type) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); //SPI1_NSS GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA4 GPIO_Init(GPIOA,&GPIO_InitStructure); //SPI1_CLK GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 GPIO_Init(GPIOA, &GPIO_InitStructure); //SPI_MISO GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//PA6 GPIO_Init(GPIOA, &GPIO_InitStructure); //SPI_MOSI GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//PA7 GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_I2S_DeInit(bus_type); //ía2¿ÖD¶Ïêäèë GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PD4 GPIO_Init(GPIOD, &GPIO_InitStructure); //SPI ENABLE Æà1à1¤¾ßêä3ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PD3 GPIO_Init(GPIOD, &GPIO_InitStructure); // SPIx Enable = 0 for SPI Mode // SPIx Enable = RSN for GP22 GPIO_WriteBit(GPIOD, GPIO_Pin_3, Bit_RESET); } void SPIx_I2Cx_Interface_Init(void* bus_type) { //3õê¼»ˉSPIx½ó¿ú SPI_InitTypeDef SPI_InitStructure; //RCC_SYSCLKConfig (RCC_SYSCLKSource_HSI); //RCC_HCLKConfig (RCC_SYSCLK_Div1); RCC_APB2PeriphResetCmd (RCC_APB2Periph_SPI1, DISABLE); RCC_APB2PeriphClockCmd (RCC_APB2Periph_SPI1, ENABLE); // All are defined in stm32f10x_spi.h SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;// SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // SPI frequence devider SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // Apply SPIx configuration SPI_Init(bus_type, &SPI_InitStructure); // Enabling the SPIx Interface SPI_Cmd(bus_type, ENABLE); // Enabling the NSS Output during transmission SPI_SSOutputCmd (bus_type, ENABLE); GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET); } |
1123qqw 发表于 2022-10-12 10:46 晕死,被带沟里去了, 你说两个芯片SPI通讯, 潜意识就认为 是两个单片机了。弄了半天是 控制器件。 PCAP01 没有用过,不清楚,不过SPI 操控器件, 时好时坏, 无非3个原因 1,线路没接好,有干扰,器件的供电没有,有效的滤波。(检查线路,排除干扰,增加滤波电容,从你的原理图上看,6脚这里应该添加 104电容) 2,主机的 SPI 驱动力不够,距离较远,1/0转换不及时 (添加上拉电阻) 3,SPI 设定的传输速度过快,接近器件的极限值。(降低SPI的速度,测试时建议调到最慢速度。) |
yzwzfyz 发表于 2022-10-12 08:27 从机是PCAP01芯片,说明手册并没有给我如何设置,只是给了一个启动SPI的方式。 |
本帖最后由 1123qqw 于 2022-10-12 10:59 编辑 188610329 发表于 2022-10-11 22:21 交换的数据为21位的浮点数。我怎么确保从机能收到呢?芯片手册并没有给如何设置,只是给了一个端口,设置为低电平就能启动SPI通信。 |
|
你要保证,当你发送的时候,对方在收!! 建议用中断方式解决这个问题。 |
|
不是指 SPI 的传输速度 快慢,而是指 SPI 传指令 给 从机, 从机 接受到 指令, 处理,准备数据 回传给主机,这个过程需要时间的, 但是,时钟是主机发出的,主机是不知道 从机 准备没准备好的。 所以,这个指令的复杂程度,从机需要处理的时间, 主机这边要有 充分的等待, 才能 发出时钟 取数据。 同样,主机发出 CE/SS 信号,然后发数据 给从机, 这个时候,从机在干什么? 你能不能确保,这个时候从机就 等在 SPI 线程上 等待指令接收完毕,立刻处理? 如果,这个时候,从机在处理别的事情,你又没有机制,让从机停止工作,来处理SPI 发来的指令? 这是 双机通讯中必须考虑的问题。 因为,不知道你 双机 SPI 通讯 具体进行什么 数据交互,就只能推测这些了。 |
188610329 发表于 2022-10-11 18:41 那您的意思是速度太快了吗?可是有的时候,我再重新烧录程序的时候,会全部复位在进行烧录。有的时候能通信,有的时候就不行。要是因为速度的话,每次重新开始的时候,不应该时好时坏。 |
| 主机需要考虑从机的响应和处理速度。从机需要考虑在做任何处理时,都能停下手头的工作,响应主机的要求。 |