标题: 单片机SPI主机向从机发送数据的问题 [打印本页]

作者: ADMIN_ALLENY    时间: 2020-8-13 09:48
标题: 单片机SPI主机向从机发送数据的问题
void ma_write(uchar addr,uchar dat)
{
    uchar cycle1;
        uint value=0;
        value = (( 0x80 | addr ) << 8 ) | dat ;//写命令 + 地址 + 数据
        ma_cs = 0;
        for( cycle1=0 ; cycle1<16 ; cycle1++ )
        {
           ma_sclk = 0;                      delay1(1);
           ma_mosi = value&0x8000;  delay1(1);
           ma_sclk = 1;                            delay1(1);
           value <<= 1;
        }
        ma_cs = 1;
        delay1(25);
}
我用是的STC15W4K56S4的单片机,从机中写寄存器操作是一个16位的二进制数 ,包括3位命令+5位地址+8位数据。我把单片机的P1^3口定义为ma_mosi,在上面语句中(ma_mosi = value&0x8000;)这一句表达合不合理?因为MOSI脚是一位一位的发送数据,这一语句发送的直接是一个16位数了,这样是不是不合适的?
本人水平偏低,目前是在学习中,可能这个问题有些愚笨,尽管如此,还是希望大神不吝赐教,越简单易懂越好,谢谢。


作者: 心有浮生    时间: 2020-8-13 13:27
你这ma_mosi = value&0x8000;加个判断,if(ma_mosi = value&0x8000;)就发1,else就发0,这样就可以确保每次只发最高位了,然后发完改变value的值,发送下一位。
void ma_write(uchar addr,uchar dat)
{
    uchar cycle1;
        uint value=0;
        value = (( 0x80 | addr ) << 8 ) | dat ;//写命令 + 地址 + 数据
        ma_cs = 0;
        for( cycle1=0 ; cycle1<16 ; cycle1++ )
        {
           ma_sclk = 0;                      delay1(1);
           if(value&0x8000)
                 ma_mosi=1;  
          else
                 ma_mosi=0;
           delay1(1);
           ma_sclk = 1;                            delay1(1);
           value <<= 1;
        }
        ma_cs = 1;
        delay1(25);
}
作者: 13487086265    时间: 2020-8-13 13:32
51内核是8位的!只能8位8位的发!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1