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

单片机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配置有问题。

程序已上传,在一口,能抽空帮我看下吗?
自己感觉是没问题的,也许是自己检查不出来...
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版