打印
[技术问答]

MUC140之CS5532驱动

[复制链接]
1675|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2014-2-19 00:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试了好久,终于搞定
void CS5532WriteByte(uint32_t u32Data)
{
        uint8_t u8i;
        ClrBit_CSCLK();//先把时钟拉低
        ClrBit_SDI();//数据拉低
        for(u8i = 0;u8i<8;u8i++)
        {  
                if(u32Data&0x80)//高位先出
                {
                SetBit_SDI();
                }
                else
                {          
                ClrBit_SDI();       
                }
                DrvSYS_Delay(2);
                SetBit_CSCLK();//时钟拉高
                DrvSYS_Delay(2);
                ClrBit_CSCLK();//时钟拉低
                u32Data<<=1;//数据移位
        }
        ClrBit_CSCLK();//时钟拉低
        ClrBit_SDI();
}


沙发
niuyaliang|  楼主 | 2014-2-19 00:51 | 只看该作者
uint32_t CS5532ReadReg(void)//向CS5532读寄存器中的数据
{
        uint8_t u8i;
        uint32_t u32ReadValue = 0;
        ClrBit_CSCLK();//时钟拉低
        SetBit_SDO();//
        DrvSYS_Delay(2);
        for(u8i = 0;u8i < 32; u8i++)
        {

                if(Get_SDO_Bit() == 1) //假如读取的是高电平
                {
                        u32ReadValue|=0x00000001;  //把高电平给了最低位,因为MSB优先
                }
                DrvSYS_Delay(2);
                SetBit_CSCLK();//时钟拉高
                DrvSYS_Delay(2);
                ClrBit_CSCLK();//时钟拉低
                if(u8i < 31)//最后一次应该不移位才对
                {
                u32ReadValue<<=1;//
                }
        }
        ClrBit_CSCLK();//时钟拉低
        SetBit_SDO();//
        return u32ReadValue;
}

使用特权

评论回复
板凳
niuyaliang|  楼主 | 2014-2-19 00:52 | 只看该作者
本帖最后由 niuyaliang 于 2014-2-19 00:54 编辑

主要注意以下三点
1.SDO/SDI/SCLK必须都设置成为双向IO模式,设置成其他的不可以
2.读取寄存器中的值时,最后一次不进行移位操作
3.注意DrvGPIO_GetBit与DrvGPIO_GetDoutBit这两个库函数之间的区别

使用特权

评论回复
地板
缥缈九哥| | 2014-2-19 09:52 | 只看该作者
IO模拟的呀?

使用特权

评论回复
5
niuyaliang|  楼主 | 2014-2-19 09:54 | 只看该作者
缥缈九哥 发表于 2014-2-19 09:52
IO模拟的呀?

SPI的还没搞出来,哈哈,只能先IO模拟了

使用特权

评论回复
6
zxf0168| | 2014-2-20 14:08 | 只看该作者
niuyaliang 发表于 2014-2-19 09:54
SPI的还没搞出来,哈哈,只能先IO模拟了

不错,我看好你

使用特权

评论回复
7
niuyaliang|  楼主 | 2014-2-20 16:02 | 只看该作者
dwh000 发表于 2014-2-20 15:32
cs5560没有明确说,记性不行了!

是SPI总线

使用特权

评论回复
8
niuyaliang|  楼主 | 2014-2-21 12:00 | 只看该作者
uint32_t CS5532ReadData(void)//向CS5532读寄存器中的数据
{
        uint8_t u8i;
        uint32_t u32ReadValue = 0;
        ClrBit_CSCLK();//时钟拉低
        ClrBit_SDO();
        ClrBit_SDI();        
        for(u8i = 0;u8i < 8;u8i++)//8个清串口时钟
        {
                DrvSYS_Delay(2);
                SetBit_CSCLK();//时钟拉高
                DrvSYS_Delay(2);
                ClrBit_CSCLK();//时钟拉低
        }
        ClrBit_CSCLK();//时钟拉低
        DrvSYS_Delay(2);
        for(u8i = 0;u8i < 32; u8i++)
        {

                if(Get_SDO_Bit() == 1) //假如读取的是高电平
                {
                        u32ReadValue|=0x00000001;  //把高电平给了最低位,因为MSB优先
                }
                DrvSYS_Delay(2);
                SetBit_CSCLK();//时钟拉高
                DrvSYS_Delay(2);
                ClrBit_CSCLK();//时钟拉低
                if(u8i < 31)//最后一次应该不移位才对
                {
                u32ReadValue<<=1;//
                }
        }
        ClrBit_CSCLK();//时钟拉低
        SetBit_SDO();//
        DrvSYS_Delay(2);
        ClrBit_SDO();//
        return u32ReadValue>>11;
}
读CS5532的数据驱动

使用特权

评论回复
9
Harvard| | 2014-3-2 21:40 | 只看该作者
还可以

使用特权

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

本版积分规则

212

主题

2427

帖子

7

粉丝