找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1462|回复: 2
打印 上一主题 下一主题
收起左侧

单片机SPI主机向从机发送数据的问题

[复制链接]
跳转到指定楼层
楼主
ID:721008 发表于 2020-8-13 09:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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位数了,这样是不是不合适的?
本人水平偏低,目前是在学习中,可能这个问题有些愚笨,尽管如此,还是希望大神不吝赐教,越简单易懂越好,谢谢。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:654028 发表于 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);
}
回复

使用道具 举报

板凳
ID:701852 发表于 2020-8-13 13:32 | 只看该作者
51内核是8位的!只能8位8位的发!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表