any_014 发表于 2015-8-10 16:16:21

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

本帖最后由 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?
for(i = 0; i < 16; i++)
      {
    SPI_SCL(0);
    ADT7310Delay(6);
    if(GPIO_ReadInputDataBit(GPIOB, 4) == 0)
      spi_misoValue++;
    ADT7310Delay(2);
    SPI_SCL(1);
    ADT7310Delay(8);
      }
----------------------------------2015.08.18----------------------------------------
上传下现在的程序,希望有空闲的朋友帮我看下。
工程是以野火历程的模板建的,我水平有限,写的有点混乱,见笑。






any_014 发表于 2015-8-10 16:24:38

完整函数,该函数参考AD7320芯片的官方参考例子。
u16 ReadFromADT7310ViaSPI(u8 reg_address)
{
      u8 i;
      u8 spi_Value;
               
      spi_Value = (0x78 & ((reg_address + 8) << 3));
      ADT7310_CS(1);
      SPI_SCL(1);
      ADT7310_CS(0);
      ADT7310Delay(5);
      
      for(i = 0; i < 8; i++)
      {
                SPI_SCL(0);
                if((spi_Value & 0x80) == 0x80)
                        SPI_MOSI(1);
                else
                        SPI_MOSI(0);
                ADT7310Delay(5);
                SPI_SCL(1);
                spi_Value = (spi_Value << 1);
                ADT7310Delay(5);      
      }
      for(i = 0; i < 16; i++)
      {
                SPI_SCL(0);
//                spi_misoValue = (spi_misoValue << 1);
//                ADT7310Delay(6);
                if(GPIO_ReadInputDataBit(GPIOB, 4) == 1)
                        spi_misoValue++;
//                        spi_misoValue |= 0x0001;
//                else
//                        spi_misoValue &= 0xfffe;
                ADT7310Delay(8);
                SPI_SCL(1);
                ADT7310Delay(8);
      }
      SPI_SCL(1);
      ADT7310_CS(1);
      GPIOA->ODR ^= GPIO_Pin_0;
      return spi_misoValue;
}改成这样,判断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灯的亮灭。没问题。
u16 ReadFromADT7310ViaSPI(u8 reg_address)
{
      u8 i;
      u8 spi_Value;
               
      spi_Value = (0x78 & ((reg_address + 8) << 3));
      ADT7310_CS(1);
      SPI_SCL(1);
      ADT7310_CS(0);
      ADT7310Delay(5);
      
      for(i = 0; i < 8; i++)
      {
                SPI_SCL(0);
                if((spi_Value & 0x80) == 0x80)
                        SPI_MOSI(1);
                else
                        SPI_MOSI(0);
                ADT7310Delay(5);
                SPI_SCL(1);
                spi_Value = (spi_Value << 1);
                ADT7310Delay(5);      
      }
      for(i = 0; i < 16; i++)
      {
                SPI_SCL(0);
                spi_misoValue = (spi_misoValue << 1);
                ADT7310Delay(10);
                if(GPIO_ReadInputDataBit(GPIOB, 4) == 1)
                        GPIOA->ODR ^= GPIO_Pin_1;
                else
                        GPIOA->ODR ^= GPIO_Pin_2;
//                        spi_misoValue |= 0x0001;
//                else
//                        spi_misoValue &= 0xfffe;
                ADT7310Delay(2);
                SPI_SCL(1);
                ADT7310Delay(8);
      }
      SPI_SCL(1);
      ADT7310_CS(1);
      GPIOA->ODR ^= GPIO_Pin_0;
      return spi_misoValue;
}


发表于 2015-8-18 17:12:07

看一下是不是配置IO口的时候,PB4配置有问题。

any_014 发表于 2015-8-18 17:28:48

安 发表于 2015-8-18 17:12
看一下是不是配置IO口的时候,PB4配置有问题。

程序已上传,在一口,能抽空帮我看下吗?
自己感觉是没问题的,也许是自己检查不出来...
页: [1] 2
查看完整版本: 单片机IO口模拟SPI,读取不到发回来的数,确认管脚上有高...