发新帖我要提问
12
返回列表
打印
[AVR单片机]

mega16硬件SPI写数据的问题,,SPDR一直是0xFF...

[复制链接]
楼主: zhao3462910
手机看帖
扫描二维码
随时随地手机跟帖
21
zhao3462910|  楼主 | 2013-5-13 11:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
huangxz 发表于 2013-5-13 11:08
从波形上看你的SO线一直是高电平,当然SPDR是0xff了。SPDR接收是根据sck时钟信号采样SO信号得到的。
另外 ...

示波器探头只有一个。。。怎么同时采集四路信号。。这我还没玩过。。。求指教?。。。

使用特权

评论回复
22
huangxz| | 2013-5-13 11:20 | 只看该作者
zhao3462910 发表于 2013-5-13 11:13
示波器探头只有一个。。。怎么同时采集四路信号。。这我还没玩过。。。求指教?。。。 ...

:L,要有那种一个示波器上接四个探头的就可以了,比如我们用的DPO 2014就可以同时采样四路信号

不过楼主的问题应该找的差不多了吧,只要你的SO信号正确了,SPDR里就会有正确的数据

使用特权

评论回复
23
zhao3462910|  楼主 | 2013-5-13 11:31 | 只看该作者
huangxz 发表于 2013-5-13 11:20
,要有那种一个示波器上接四个探头的就可以了,比如我们用的DPO 2014就可以同时采样四路信号

不过楼主的 ...

哦。。我这示波器是老古董。。没四路的。。为什么SO没有波形呢?。。原因一:SI脚上没有写进去数据,,但是SI脚上又有波形啊。。。只有这种原因吧?。。我实在找不到问题的突破口。。

使用特权

评论回复
24
huangxz| | 2013-5-13 11:34 | 只看该作者
zhao3462910 发表于 2013-5-13 11:31
哦。。我这示波器是老古董。。没四路的。。为什么SO没有波形呢?。。原因一:SI脚上没有写进去数据,,但 ...

一般情况下第一个发送的字节是命令,从第二个字节开始才有回复,
楼主可以看下外接的芯片的说明书,看从第几个开始芯片开始输出SO数据
让后连续发送几个字节看看

使用特权

评论回复
25
zhao3462910|  楼主 | 2013-5-13 11:40 | 只看该作者
huangxz 发表于 2013-5-13 11:34
一般情况下第一个发送的字节是命令,从第二个字节开始才有回复,
楼主可以看下外接的芯片的说明书,看从第几 ...

我发送函数是写在while(1)中的,,连续发送。。并且中间有很长的延时。。。这样间断的发送多次。。一次都收不到。。。SI引脚上又有波形。。比较头痛。。。不知道问题的所在。。。

使用特权

评论回复
26
huangxz| | 2013-5-13 11:42 | 只看该作者
zhao3462910 发表于 2013-5-13 11:40
我发送函数是写在while(1)中的,,连续发送。。并且中间有很长的延时。。。这样间断的发送多次。。一次都 ...

你用的是啥芯片,(外面的)

使用特权

评论回复
27
zhao3462910|  楼主 | 2013-5-13 11:47 | 只看该作者
MCP2515 CAN控制器。。。这个芯片只要上电复位。就进去了配置模式了的。。

使用特权

评论回复
28
zhao3462910|  楼主 | 2013-5-13 11:47 | 只看该作者
huangxz 发表于 2013-5-13 11:42
你用的是啥芯片,(外面的)

MCP2515 CAN控制器。。。这个芯片只要上电复位。就进去了配置模式了的。。

使用特权

评论回复
29
huangxz| | 2013-5-13 11:52 | 只看该作者
zhao3462910 发表于 2013-5-13 11:47
MCP2515 CAN控制器。。。这个芯片只要上电复位。就进去了配置模式了的。。

呵呵,早说嘛,

你看看,最简单的读状态命令也是从第二个字节开始才有SO输出的
而且重要的是第一个字节和第二个字节之间cs信号不能变
你先调整好你的cs信号,连续发送三个字节,这样你就可以收到数据了

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
30
zhao3462910|  楼主 | 2013-5-13 12:00 | 只看该作者
huangxz 发表于 2013-5-13 11:52
呵呵,早说嘛,

你看看,最简单的读状态命令也是从第二个字节开始才有SO输出的
//*******************************CAN读数据**************************************
uchar CAN_Read_SS(uchar address)
{
        uchar ret;
        CANCSUP;                           //片选拉高
        DelayUs(4);
        CANCSDW;                        // 片选拉低,使能MCP2510
        DelayUs(4);

        SPISendByte(0x03);               // 写 0x30读指令         
        SPISendByte(address);            // 写地址
        ret = SPIRecvByte();               //读数据

        CANCSUP;                          //片选拉高
        return ret;           
}
//********************************CAN写数据*************************************
void CAN_Write_SS(uchar address,uchar Value)
{
        CANCSUP;
        DelayUs(4);
        CANCSDW;                        // 片选拉低,使能MCP2510
        DelayUs(4);
       
        SPISendByte(0x02);            //  写命令
        SPISendByte(address);         //  写地址
        SPISendByte(Value);           //  写数据

        CANCSUP;                        // 片选拉高
        DelayUs(5);
}
我是这样的。。。在写指令,写地址,写数据时,CS是一直拉低的。。。读也是一直拉低的。。。

使用特权

评论回复
31
huangxz| | 2013-5-13 12:07 | 只看该作者
zhao3462910 发表于 2013-5-13 12:00
我是这样的。。。在写指令,写地址,写数据时,CS是一直拉低的。。。读也是一直拉低的。。。
...

avr的spi高位先出啊,
建议楼主
1.确认下是不是0,0 或1,1模式
2.read status是write 0xa0, 还是 0x05

使用特权

评论回复
32
zhao3462910|  楼主 | 2013-5-14 08:52 | 只看该作者
huangxz 发表于 2013-5-13 12:07
avr的spi高位先出啊,
建议楼主
1.确认下是不是0,0 或1,1模式

配置的是00模式。。。read status是write 0xa0   这个在2515的手册上有。。。我程序里也是0xa0

使用特权

评论回复
33
huangxz| | 2013-5-14 09:57 | 只看该作者
zhao3462910 发表于 2013-5-14 08:52
配置的是00模式。。。read status是write 0xa0   这个在2515的手册上有。。。我程序里也是0xa0 ...

楼主再不行就只能考虑是不是mcp2515有问题了,我曾经在一家公司用过mega128+mcp2515实现CAN通信,没任何问题

使用特权

评论回复
34
zhao3462910|  楼主 | 2013-5-14 11:38 | 只看该作者
huangxz 发表于 2013-5-14 09:57
楼主再不行就只能考虑是不是mcp2515有问题了,我曾经在一家公司用过mega128+mcp2515实现CAN通信,没任何问 ...

可否把您的程序给我参考下。。。。

使用特权

评论回复
35
huangxz| | 2013-5-14 12:04 | 只看该作者
zhao3462910 发表于 2013-5-14 11:38
可否把您的程序给我参考下。。。。

已经离开那家公司很久了,呵呵,没多复杂。除非mcp坏了,肯定会响应的,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则