打印
[AVR单片机]

atmega16 SPI 读取ADC程序

[复制链接]
1935|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


ADC芯片是CS5513,线路连接如下:
CS5513                    ATMEGA16
SCLK<--------------->SCK(PB7)
SDO <--------------->MISO(PB6)
CS    <--------------->SS(PB4)
ATMEGA16 MOSI(PB6)悬空

这几天一直在写这个读取程序,写了很多个,也试过模拟SPI,但一直读不出结果。我的编程思路是,首先PB4输出低电平,使能CS5513,然后SPI随便写一个数据,最后读出收到的数据。
有两个疑惑1.MOSI引脚悬空是否影响程序功能
                 2.时钟同步信号的频率该如何确定
这是代码:
void SPI_init()
{
         DDRB|=0XB0;                                                                                      //SCK MOSI SS->OUT   MISO->IN
         SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);                     //使能SPI、主机模式、16分频
         //SPSR=(1<<SPI2X);
}


uchar SPI_read()
{
         uchar i,data;
         PORTB&=~BIT(PB4);                                                                   //使能CS5513
         
         //while(!((PINB&0X40)==0));                                                      //SDO是否为0
                                        
         for(i=0;i<3;i++)                                                                  //ADC转换结果为24位,连续写3次
         {
         SPDR = 0x99;                                                                             //任意写一个字节,启动SCLK  
         while(!(SPSR&(1<<SPIF)));                                                    //发送是否完成
         ad_buf=SPDR;
         SPSR=0;
         }

         PORTB|=BIT(PB4);                                                                           //cs 高电平
}

相关帖子

沙发
findidiot|  楼主 | 2015-9-17 15:16 | 只看该作者
程序读出的结果一直都是00 00 00,不知道问题出在哪里

使用特权

评论回复
板凳
SD10A| | 2015-9-17 21:41 | 只看该作者
1  注意 CPOL CPHA 的配置  
2  清除SPIF 方法不对 见手册131页    可以这样做   uchar tmp=0;
tmp=SPSR;
SPDR = 0x99;      
  while(!(SPSR&(1<<SPIF)));   

使用特权

评论回复
地板
SD10A| | 2015-9-17 22:09 | 只看该作者
我的疑问是MOSI引脚悬空  那开始数据怎么移动到从机里面去?或者只要有这个操作SPDR的动作 就能启动SCLK?

使用特权

评论回复
5
SD10A| | 2015-9-17 22:16 | 只看该作者
SPDR 3次最好存在不同地方

使用特权

评论回复
6
findidiot|  楼主 | 2015-9-18 11:18 | 只看该作者
SD10A 发表于 2015-9-17 22:09
我的疑问是MOSI引脚悬空  那开始数据怎么移动到从机里面去?或者只要有这个操作SPDR的动作 就能启动SCLK?
...

这也是我的疑问,可是这款AD转换芯片根本没有MOSI引脚,所以ATMEGA16上的只能悬空啊,就是不知道这样会不会对产生时钟信号有影响

使用特权

评论回复
7
findidiot|  楼主 | 2015-9-18 11:23 | 只看该作者
SD10A 发表于 2015-9-17 22:16
SPDR 3次最好存在不同地方

不太懂你的意思,能详细点吗

使用特权

评论回复
8
findidiot|  楼主 | 2015-9-18 11:26 | 只看该作者
SD10A 发表于 2015-9-17 22:16
SPDR 3次最好存在不同地方

3次我是存到数组里的

使用特权

评论回复
9
findidiot|  楼主 | 2015-9-18 11:57 | 只看该作者
SD10A 发表于 2015-9-17 21:41
1  注意 CPOL CPHA 的配置  
2  清除SPIF 方法不对 见手册131页    可以这样做   uchar tmp=0;
tmp=SPSR;

你可真仔细,我没注意,非常感谢

使用特权

评论回复
10
SD10A| | 2015-9-20 10:39 | 只看该作者
这个问题  应该还有两个方面要注意
   1  电源连接方法要正确
   2  SLCK 应该在130KHZ以下  正常是32.768KHZ    所以要注意分频系数  
你再试验下

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ningling_21 + 2 很给力!
11
xu0801hua| | 2015-10-22 09:44 | 只看该作者
我也在做这样的程序,你做出来了吗?本人qq:414941286;可以一起讨论吗?

使用特权

评论回复
12
xu0801hua| | 2015-10-24 09:29 | 只看该作者
SD10A 发表于 2015-9-17 21:41
1  注意 CPOL CPHA 的配置  
2  清除SPIF 方法不对 见手册131页    可以这样做   uchar tmp=0;
tmp=SPSR;

好东西,大神做过这样的硬件SPI?

使用特权

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

本版积分规则

2

主题

17

帖子

1

粉丝