#define flash_SCK RD6
#define flash_SO RD2
#define flash_SI RD7
unsigned char write_SPI(unsigned char flash_dat)
{
unsigned char i;
flash_SCK= 0;
for(i=0;i<8;i++)
{
if(flash_dat&0x80)
flash_SI=1;
else
flash_SI=0;
flash_dat= flash_dat<<1;
delay(2);
flash_SCK= 1;
}
}
unsigned char read_SPI(void)
{
unsigned char i,rByte=0;
for(i=0;i<8;i++)
{
flash_SCK=0;
flash_SCK=1;
rByte<<=1;
rByte|=flash_SO;
}
return rByte;
}
请不吝指教,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
unsigned char write_SPI(unsigned char flash_dat)
{
................
flash_dat= flash_dat<<1;
delay(2);
flash_SCK= 1;
delay(2); // 增加
}
unsigned char read_SPI(void)
{
unsigned char i,rByte=0;
for(i=0;i<8;i++)
{
flash_SCK=0;
flash_SCK=1;
delay(2); // 增加
rByte|=flash_SO;
rByte<<=1; // 应该在这,获取当前 BIT 状态后再左移
}
return rByte;
}
rByte|=flash_SO;
rByte<<=1; // 应该在这,获取当前 BIT 状态后再左移
这样的话读出的最后一位不就到倒数第二位上了吗?其实只要从机的spi速率能跟上,延时是可以不要的,当然为了保险在初期可以加上,调试成功后在去掉试试是否可以
另:write_SPI函数里for循环中时钟flash_SCK没有变化
一周热门 更多>