Mrcode 发表于 2014-10-23 15:19:42

模拟SPI程序书写思路

有哪位大神能帮忙列举一下,书写模拟SPI程序的大致思路和方法,小弟感激不尽。
另外,下面这段程序中有以下几个问题请教以下:
1、程序中if((i & (temp >> loop)))是什么意思?
2、通过SPI读一个数据的时候不用发送一个地址的吗?以下程序uchar SPI_READ_ONE_DATA(void) 好像没有。
void SPI_SEND_ONE_DATA(uchar i)    //SPI发一个字节
{
uchar loop;
uint delay;
uchar temp;
temp = 0x80;
for(loop = 0; loop < 8; loop++)
{
   if((i & (temp >> loop)))
    DIN_1;
   else
   DIN_0;
   for(delay = 10;delay > 0; delay--);
   SCLK_1;
   for(delay = 50;delay > 0; delay--);
   SCLK_0;
   for(delay = 50;delay > 0; delay--);
}
//for(delay = 50;delay> 0; delay--);
}

uchar SPI_READ_ONE_DATA(void)//SPI收一个字节
{
uchar loop;
uint delay;
uchar temp;
uchar i;
i = 0x00;
for(loop = 0; loop < 8; loop++)
{
   i = i << 1;
   SCLK_1;
   for(delay = 50; delay > 0; delay--);
   temp = P1IN;
   if((temp & 0x08))
   i |= 0x01;
   SCLK_0;
   for(delay = 50;delay > 0; delay--);
}
//for(delay = 50;delay > 0; delay--);
return i;
}

suny1022 发表于 2014-10-24 08:59:19

if((i & (temp >> loop)))   把数据分成1bit 1bit发送出去。譬如 i = 01100 0000,那么第一次就是0000 0000,那么为假DIN_0,第二次就是0100 0000 ,为真DIN_1.

Mrcode 发表于 2014-10-24 09:29:01

suny1022 发表于 2014-10-24 08:59
if((i & (temp >> loop)))   把数据分成1bit 1bit发送出去。譬如 i = 01100 0000,那么第一次就是0000 0000 ...

你好,我想问一下temp=0x80是什么意思?

siroyiryuu 发表于 2014-10-26 23:24:54

本帖最后由 siroyiryuu 于 2014-10-26 23:27 编辑

汉字编码区别于其他编码的标志就是汉字编码的最高位是1。 0x80在计算机内部表示为1000 0000,这段程序常用于判断当前字符是否是汉字。&是按位与, 对应都是1时才为1, 其它情况均未0. 如: 1010 1011 & 1000 0000 = 1000 0000 即你问题中的 temp&0x80。

或者:
temp|=0x80; //等价于
temp=temp|0x80;//表示将temp第一个字节的最高位置为1。

其实百度一下都有……

suny1022 发表于 2014-10-27 17:15:12

Mrcode 发表于 2014-10-24 09:29
你好,我想问一下temp=0x80是什么意思?

楼上说的很清楚了,汉字的编码规则确定了第一位为1,0X80的最高位就为1,然后&去判断

fiddly 发表于 2014-10-28 13:10:23

Mrcode 发表于 2014-10-24 09:29
你好,我想问一下temp=0x80是什么意思?

取一个字节最高位的常数,取低位用0x01。

Mrcode 发表于 2014-10-31 15:43:17

siroyiryuu 发表于 2014-10-26 23:24
汉字编码区别于其他编码的标志就是汉字编码的最高位是1。 0x80在计算机内部表示为1000 0000,这段程序常用 ...

谢谢,我明白了,呵呵。

lingergz 发表于 2014-11-3 14:32:53

大家都解释得很详细了,我围观下就好。最希望看到这样的情况,互助

MC-26 发表于 2015-10-20 15:13:30

2、通过SPI读一个数据的时候不用发送一个地址的吗?以下程序uchar SPI_READ_ONE_DATA(void) 好像没有。

楼主的第二条问题,好像还没人回答哦。

suny1022 发表于 2015-10-21 12:35:59

MC-26 发表于 2015-10-20 15:13
2、通过SPI读一个数据的时候不用发送一个地址的吗?以下程序uchar SPI_READ_ONE_DATA(void) 好像没有。

楼 ...

楼上的应该是一主一从的情况,如果是多从需要约定地址
页: [1]
查看完整版本: 模拟SPI程序书写思路