单片机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----------------------------------------
上传下现在的程序,希望有空闲的朋友帮我看下。
工程是以野火历程的模板建的,我水平有限,写的有点混乱,见笑。
完整函数,该函数参考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,好像只是自加了一次就再也不自加了。
采集的时候数据如下。因为发送的是01,他只会增加一次,可以修改为其他值,比如FF。
spi_misoValue |= (0x0001<<i);
本帖最后由 any_014 于 2015-8-10 17:22 编辑
安 发表于 2015-8-10 16:58
采集的时候数据如下。因为发送的是01,他只会增加一次,可以修改为其他值,比如FF。
spi_misoValue |= (0x0 ...
spi_misoValue |= (0x0001<<i); 这句话已屏蔽。
PB4脚上有连续的高低电平,按说应该是不断的自增。
if(GPIO_ReadInputDataBit(GPIOB, 4) == 1)
spi_misoValue++;
确认是这句话有问题,如果判断是否是0,则条件成立。
如果改成判断是否是1,则只加一次...
今天比较晚了,下班,明天再试。 帮顶 你发送的数据是0x01,那么只有1个高电平。如果你发送的是0x55呢?0xAA呢? 本帖最后由 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;
}
看一下是不是配置IO口的时候,PB4配置有问题。 安 发表于 2015-8-18 17:12
看一下是不是配置IO口的时候,PB4配置有问题。
程序已上传,在一口,能抽空帮我看下吗?
自己感觉是没问题的,也许是自己检查不出来...
页:
[1]
2