OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2652|回复: 1

关于通过SPI写外设寄存器

[复制链接]

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-8-20
在线时间
22 小时
发表于 2016-5-5 09:08:19 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 漫天WPF飞雪 于 2016-5-5 17:48 编辑


我用Si4112芯片    stm32模拟的SPI 来写程序,但是输出频率总是有误差;我要得到391MHz的频率 ,但是输出的是333MHz。
请看下我的代码:请哪位大神帮忙指点下。
int main(void)
{
     delay_init();                     //Ñóê±oˉêy3õê¼»ˉ       
          
          
     SPI_GPIO_Config();
     SET_POWERD;
        //SPI_init();
     delay_ms(100);

         Si4112_SendData(0x00001404,0x00);      //register 0:  Auxiliary Output set low,
        delay_ms(50);                                      //VCO frequency/2,KPs=1,AUTOPDB=0;

        Si4112_SendData(0x00000002,0x02);      //register 2:IF synthesizer on.
       delay_ms(50);

          Si4112_SendData(0x0000030E,0x05);      //register 5:N-Divider for IF Synthesizer:782
        delay_ms(50);
          
            Si4112_SendData(0X00000014,0x08);      //register 8:R-Divider for IF Synthesizer:20   
        delay_ms(50);


while (1)
      {

      };


}


        void Si4112_SendData(uint32 dat,uint8 addr)
                        {
                                        uint32 sedata;
                                        uint8 i;

                         sedata = ((dat << 4) | (addr & 0x0F));  // êy&#190;Y + μ&#216;&#214;·
                         sedata <<= 10;                           // ×óò&#198;10&#206;&#187;
                       
                         SET_SEN;
                         delay_us(200);       
                       
                         CLEAR_SCLK;
                         delay_us(200);         
                       
                         SDATA=0;
                         CLEAR_SEN;
                                        for(i = 0;i < 22;i++)
                                        {
                                                        if(sedata & 0x80000000)
                                                        {
                                                          SDATA = 1;
                                                        }
                                                  else
                                                  {
                                                     SDATA = 0;
                                                  }
                        
                                        delay_us(200);       
                                        SET_SCLK;        // é&#207;éy&#209;&#216;êy&#190;Y&#203;&#248;′&#230;
                                        delay_us(200);               
                                        CLEAR_SCLK;
                                        delay_us(200);       
                                        sedata <<= 1;
                                                }
                                       
                                        SET_SEN;
                        }

最佳答案

查看完整内容[请看2#楼]

就我的经验, 不论51、AVR、PIC、ARM,SPI只有8位和16位两种位宽度, 32位肯定没有。 所以,芯片肯定要考虑这种情况。 换句话说,8位操作一定能正常工作。 至于高16、低16位,肯定是后者; 但问题是:你设置了几位?如果是8位就另说了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11548
金钱
11548
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-5-5 09:08:20 | 显示全部楼层
就我的经验,
不论51、AVR、PIC、ARM,SPI只有8位和16位两种位宽度,
32位肯定没有。

所以,芯片肯定要考虑这种情况。
换句话说,8位操作一定能正常工作。

至于高16、低16位,肯定是后者;
但问题是:你设置了几位?如果是8位就另说了。



回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 17:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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