你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

单片机IO口模拟SPI,读取不到发回来的数,确认管脚上有高...

[复制链接]
any_014 提问时间:2015-8-10 16:16 /
本帖最后由 any_014 于 2015-8-18 17:00 编辑

用IO口模拟SPI,用的PB4做的MISO脚。
读取数据时出错,总是接收不到数据,后来用示波器测量了下IO口,有高低电平。
于是用以下部分测试,如果PB4是0的话,spi_misoValue加一,然后用串口将spi_misoValue发上来。
结果判断PB4是0的话,spi_misoValue没执行这段自加12次;
如果判断PB4是1的话,spi_misoValue始终没有自加。
好象是时序出了问题?没有在正确的时间端判断PB4?
  1. for(i = 0; i < 16; i++)
  2.         {
  3.     SPI_SCL(0);
  4.     ADT7310Delay(6);
  5.     if(GPIO_ReadInputDataBit(GPIOB, 4) == 0)
  6.         spi_misoValue++;
  7.     ADT7310Delay(2);
  8.     SPI_SCL(1);
  9.     ADT7310Delay(8);
  10.         }
复制代码

----------------------------------2015.08.18----------------------------------------
上传下现在的程序,希望有空闲的朋友帮我看下。
工程是以野火历程的模板建的,我水平有限,写的有点混乱,见笑。


94.jpg 95.jpg

V1_0.zip (2.52 MB, 下载次数: 22)
收藏 评论13 发布时间:2015-8-10 16:16

举报

13个回答
any_014 回答时间:2015-8-10 16:24:38
完整函数,该函数参考AD7320芯片的官方参考例子。
  1. u16 ReadFromADT7310ViaSPI(u8 reg_address)
  2. {
  3.         u8 i;
  4.         u8 spi_Value;
  5.                
  6.         spi_Value = (0x78 & ((reg_address + 8) << 3));
  7.         ADT7310_CS(1);
  8.         SPI_SCL(1);
  9.         ADT7310_CS(0);
  10.         ADT7310Delay(5);
  11.         
  12.         for(i = 0; i < 8; i++)
  13.         {
  14.                 SPI_SCL(0);
  15.                 if((spi_Value & 0x80) == 0x80)
  16.                         SPI_MOSI(1);
  17.                 else
  18.                         SPI_MOSI(0);
  19.                 ADT7310Delay(5);
  20.                 SPI_SCL(1);
  21.                 spi_Value = (spi_Value << 1);
  22.                 ADT7310Delay(5);        
  23.         }
  24.         for(i = 0; i < 16; i++)
  25.         {
  26.                 SPI_SCL(0);
  27. //                spi_misoValue = (spi_misoValue << 1);
  28. //                ADT7310Delay(6);
  29.                 if(GPIO_ReadInputDataBit(GPIOB, 4) == 1)
  30.                         spi_misoValue++;
  31. //                        spi_misoValue |= 0x0001;
  32. //                else
  33. //                        spi_misoValue &= 0xfffe;
  34.                 ADT7310Delay(8);
  35.                 SPI_SCL(1);
  36.                 ADT7310Delay(8);
  37.         }
  38.         SPI_SCL(1);
  39.         ADT7310_CS(1);
  40.         GPIOA->ODR ^= GPIO_Pin_0;
  41.         return spi_misoValue;
  42. }
复制代码
改成这样,判断PB4是不是1来控制spi_misoValue自加一的话,发上来的数是01,好像只是自加了一次就再也不自加了。

废鱼 回答时间:2015-8-10 16:58:11
采集的时候数据如下。因为发送的是01,他只会增加一次,可以修改为其他值,比如FF。
spi_misoValue |= (0x0001<<i);


any_014 回答时间:2015-8-10 17:21:41
本帖最后由 any_014 于 2015-8-10 17:22 编辑
安 发表于 2015-8-10 16:58
采集的时候数据如下。因为发送的是01,他只会增加一次,可以修改为其他值,比如FF。
spi_misoValue |= (0x0 ...

spi_misoValue |= (0x0001<<i);   这句话已屏蔽。

PB4脚上有连续的高低电平,按说应该是不断的自增。
any_014 回答时间:2015-8-10 17:33:39
if(GPIO_ReadInputDataBit(GPIOB, 4) == 1)
                        spi_misoValue++;
确认是这句话有问题,如果判断是否是0,则条件成立。
如果改成判断是否是1,则只加一次...
今天比较晚了,下班,明天再试。
你好我好大家好! 回答时间:2015-8-10 18:38:28
帮顶                             
废鱼 回答时间:2015-8-11 10:20:20
你发送的数据是0x01,那么只有1个高电平。如果你发送的是0x55呢?0xAA呢?
any_014 回答时间:2015-8-18 16:26:27
本帖最后由 any_014 于 2015-8-18 16:35 编辑

就是不能读取高电平成功。
修改了下程序,在SPI读数的时候,如果读的是高电平就让LED1取反,如果读的是低电平,就让LED2取反。
结果发现LED2不停的闪烁,LED1无变化。感觉就像是读错了管脚,该管脚一直是低电平似的。可是我实际读的是PB4,PCB板上量的也是90管脚(100脚封装),有明显波形。查了下手册,90脚确实是PB4.也怀疑过PB4管脚损坏,于是编写了个程序,根据PB4的管脚点高低,控制LED灯的亮灭。没问题。
  1. u16 ReadFromADT7310ViaSPI(u8 reg_address)
  2. {
  3.         u8 i;
  4.         u8 spi_Value;
  5.                
  6.         spi_Value = (0x78 & ((reg_address + 8) << 3));
  7.         ADT7310_CS(1);
  8.         SPI_SCL(1);
  9.         ADT7310_CS(0);
  10.         ADT7310Delay(5);
  11.         
  12.         for(i = 0; i < 8; i++)
  13.         {
  14.                 SPI_SCL(0);
  15.                 if((spi_Value & 0x80) == 0x80)
  16.                         SPI_MOSI(1);
  17.                 else
  18.                         SPI_MOSI(0);
  19.                 ADT7310Delay(5);
  20.                 SPI_SCL(1);
  21.                 spi_Value = (spi_Value << 1);
  22.                 ADT7310Delay(5);        
  23.         }
  24.         for(i = 0; i < 16; i++)
  25.         {
  26.                 SPI_SCL(0);
  27.                 spi_misoValue = (spi_misoValue << 1);
  28.                 ADT7310Delay(10);
  29.                 if(GPIO_ReadInputDataBit(GPIOB, 4) == 1)
  30.                         GPIOA->ODR ^= GPIO_Pin_1;
  31.                 else
  32.                         GPIOA->ODR ^= GPIO_Pin_2;
  33. //                        spi_misoValue |= 0x0001;
  34. //                else
  35. //                        spi_misoValue &= 0xfffe;
  36.                 ADT7310Delay(2);
  37.                 SPI_SCL(1);
  38.                 ADT7310Delay(8);
  39.         }
  40.         SPI_SCL(1);
  41.         ADT7310_CS(1);
  42.         GPIOA->ODR ^= GPIO_Pin_0;
  43.         return spi_misoValue;
  44. }
复制代码



废鱼 回答时间:2015-8-18 17:12:07
看一下是不是配置IO口的时候,PB4配置有问题。
any_014 回答时间:2015-8-18 17:28:48
安 发表于 2015-8-18 17:12
看一下是不是配置IO口的时候,PB4配置有问题。

程序已上传,在一口,能抽空帮我看下吗?
自己感觉是没问题的,也许是自己检查不出来...
any_014 回答时间:2015-8-19 09:20:17
觉得也有可能是经过高速光耦,有一定的延时,读取的时刻不对。
心中月古 回答时间:2015-8-19 17:04:42
any_014 发表于 2015-8-18 17:28
程序已上传,在一口,能抽空帮我看下吗?
自己感觉是没问题的,也许是自己检查不出来... ...

PB4默认是JTAG口需要重映射。
  1. #include "gpio.h"

  2. void GPIO_Config(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);//使能复用时钟
  6.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//JTAG 口IO重映射
  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  10.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  11.        
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  15.        
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  18.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  19.        
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  22.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  23. }
复制代码
any_014 回答时间:2015-8-22 15:24:03
enjoyfreescal 发表于 2015-8-19 17:04
PB4默认是JTAG口需要重映射。

谢谢回复,查了下,确实是默认JATG模式。
然后就修改了下,但还是没什么用。
  1. void GPIO_Config(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
  5.        
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  9.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  10.        
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  13.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  14.        
  15.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  19.        
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  22.         GPIO_Init(GPIOB, &GPIO_InitStructure);       
  23. }
复制代码
心中月古 回答时间:2015-8-24 16:06:40
any_014 发表于 2015-8-22 15:24
谢谢回复,查了下,确实是默认JATG模式。
然后就修改了下,但还是没什么用。
...

还要开启在Debug模式时,使能相应IO口,DBGMCU->CR &= ~0x00000020;

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版