[技术问答] MUC140之CS5532驱动

[复制链接]
2125|8
 楼主| niuyaliang 发表于 2014-2-19 00:50 | 显示全部楼层 |阅读模式
调试了好久,终于搞定
  1. void CS5532WriteByte(uint32_t u32Data)
  2. {
  3.         uint8_t u8i;
  4.         ClrBit_CSCLK();//先把时钟拉低
  5.         ClrBit_SDI();//数据拉低
  6.         for(u8i = 0;u8i<8;u8i++)
  7.         {  
  8.                 if(u32Data&0x80)//高位先出
  9.                 {
  10.                 SetBit_SDI();
  11.                 }
  12.                 else
  13.                 {          
  14.                 ClrBit_SDI();       
  15.                 }
  16.                 DrvSYS_Delay(2);
  17.                 SetBit_CSCLK();//时钟拉高
  18.                 DrvSYS_Delay(2);
  19.                 ClrBit_CSCLK();//时钟拉低
  20.                 u32Data<<=1;//数据移位
  21.         }
  22.         ClrBit_CSCLK();//时钟拉低
  23.         ClrBit_SDI();
  24. }


 楼主| niuyaliang 发表于 2014-2-19 00:51 | 显示全部楼层
  1. uint32_t CS5532ReadReg(void)//向CS5532读寄存器中的数据
  2. {
  3.         uint8_t u8i;
  4.         uint32_t u32ReadValue = 0;
  5.         ClrBit_CSCLK();//时钟拉低
  6.         SetBit_SDO();//
  7.         DrvSYS_Delay(2);
  8.         for(u8i = 0;u8i < 32; u8i++)
  9.         {

  10.                 if(Get_SDO_Bit() == 1) //假如读取的是高电平
  11.                 {
  12.                         u32ReadValue|=0x00000001;  //把高电平给了最低位,因为MSB优先
  13.                 }
  14.                 DrvSYS_Delay(2);
  15.                 SetBit_CSCLK();//时钟拉高
  16.                 DrvSYS_Delay(2);
  17.                 ClrBit_CSCLK();//时钟拉低
  18.                 if(u8i < 31)//最后一次应该不移位才对
  19.                 {
  20.                 u32ReadValue<<=1;//
  21.                 }
  22.         }
  23.         ClrBit_CSCLK();//时钟拉低
  24.         SetBit_SDO();//
  25.         return u32ReadValue;
  26. }
 楼主| 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模拟的呀?
 楼主| niuyaliang 发表于 2014-2-19 09:54 | 显示全部楼层
缥缈九哥 发表于 2014-2-19 09:52
IO模拟的呀?

SPI的还没搞出来,哈哈,只能先IO模拟了
zxf0168 发表于 2014-2-20 14:08 | 显示全部楼层
niuyaliang 发表于 2014-2-19 09:54
SPI的还没搞出来,哈哈,只能先IO模拟了

不错,我看好你
 楼主| niuyaliang 发表于 2014-2-20 16:02 | 显示全部楼层
dwh000 发表于 2014-2-20 15:32
cs5560没有明确说,记性不行了!

是SPI总线
 楼主| niuyaliang 发表于 2014-2-21 12:00 | 显示全部楼层
  1. uint32_t CS5532ReadData(void)//向CS5532读寄存器中的数据
  2. {
  3.         uint8_t u8i;
  4.         uint32_t u32ReadValue = 0;
  5.         ClrBit_CSCLK();//时钟拉低
  6.         ClrBit_SDO();
  7.         ClrBit_SDI();        
  8.         for(u8i = 0;u8i < 8;u8i++)//8个清串口时钟
  9.         {
  10.                 DrvSYS_Delay(2);
  11.                 SetBit_CSCLK();//时钟拉高
  12.                 DrvSYS_Delay(2);
  13.                 ClrBit_CSCLK();//时钟拉低
  14.         }
  15.         ClrBit_CSCLK();//时钟拉低
  16.         DrvSYS_Delay(2);
  17.         for(u8i = 0;u8i < 32; u8i++)
  18.         {

  19.                 if(Get_SDO_Bit() == 1) //假如读取的是高电平
  20.                 {
  21.                         u32ReadValue|=0x00000001;  //把高电平给了最低位,因为MSB优先
  22.                 }
  23.                 DrvSYS_Delay(2);
  24.                 SetBit_CSCLK();//时钟拉高
  25.                 DrvSYS_Delay(2);
  26.                 ClrBit_CSCLK();//时钟拉低
  27.                 if(u8i < 31)//最后一次应该不移位才对
  28.                 {
  29.                 u32ReadValue<<=1;//
  30.                 }
  31.         }
  32.         ClrBit_CSCLK();//时钟拉低
  33.         SetBit_SDO();//
  34.         DrvSYS_Delay(2);
  35.         ClrBit_SDO();//
  36.         return u32ReadValue>>11;
  37. }
读CS5532的数据驱动
Harvard 发表于 2014-3-2 21:40 | 显示全部楼层
还可以
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部