cs5532初始化不能成功
cs5532我按照datasheet上的说明进行初始化,却总不能成功。使用的单片机是LM3s8962。和网上的一些参考例程对照过了,通过示波器观察了sclk和sdo的信号。发现我的时钟及发送的数据都是没有问题的,可是从sdi过来的数据总是没有重复性,0x00,0xff,0x10都出现过。
按道理,发送超过15个的0xff和1个0xfe,进行re-sync,然后再发送0x03,0x2000 0000开启一个复位周期,这时候接收的数据应该是0x1000 0000才对。可是我始终接收不到,有时候接受到了这样的数据,再来一次的是很又不是这个数据了。
很苦恼,哪位兄弟有碰见过类似的问题,给我个回复吧。非常感谢!
ps:我的时钟是4.096mhz的,频率没有问题,4.096左右跳动,但输出波形的幅值是250mv(交流测量),这个对cs5532工作有影响没有?
to amork:没找到合适的区,就发avr区了。 没那么复杂,初始化很简单的 to qiaoam:
我也知道这部分很简单,但总是找不到问题出在哪里了。我的程序有问题是吗?另外硬件上注意些什么? 调整下SCLK线上的时钟频率试试 to zht_omc:
现在的时钟频率是100Khz。在0~2Mhz范围内。用示波器看的,频率很准的说。
换600Khz,还是不对。
感觉不是频率的问题。 贴下代码:
//Peripheral config
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_6, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_6,GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
SSIConfig(SSI0_BASE, SSI_FRF_NMW,SSI_MODE_MASTER,ulBitRate, 8);
SSIEnable(SSI0_BASE);
GPIOPinTypeSSI(GPIO_PORTA_BASE,(GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5));//CS5532_SSI_PINS为SSI
CS5532_CS_CLR();
delay_ms(20);
//ssi init
for(i = 180; i > 0; i--)
{
SSIDataPut(SSI0_BASE,0xFF);
}
SSIDataPut(SSI0_BASE,0xFE);
//cs5532 reset
SSIDataPut(SSI0_BASE,0x03);//write config register
SSIDataPut(SSI0_BASE,0x20);//0x2000 0000
SSIDataPut(SSI0_BASE,0x00);
SSIDataPut(SSI0_BASE,0x00);
SSIDataPut(SSI0_BASE,0x00);
delay_ms(20);
//get config register to confirm if the reset is OK
SSIDataPut(SSI0_BASE,0x0B);//read config register
delay_ms(4);
SSIDataGet(SSI0_BASE,(unsigned long *)(&ucTemp));
ulConfReg = ucTemp;
SSIDataGet(SSI0_BASE,(unsigned long *)(&ucTemp));
ulConfReg = (ulConfReg<<8) + ucTemp;
SSIDataGet(SSI0_BASE,(unsigned long *)(&ucTemp));
ulConfReg = (ulConfReg<<8) + ucTemp;
SSIDataGet(SSI0_BASE,(unsigned long *)(&ucTemp));
ulConfReg = (ulConfReg<<8) + ucTemp; 这个是cs5532部分的布局。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_476905.JPG
(原文件名:未命名.JPG) SSIDataGet(SSI0_BASE,(unsigned long *)(&ucTemp));
使用这个函数的时候,系统会不会发送时钟?因为此时的SSI,以控制器来看是主模式的。 大虾好,我最近刚接触这个芯片,初始化和你相同的问题,我是发送31个FF和1个FE,然后延时一段时间,然后发送如下代码:
for (i=0;i<31;i++) //复位
CS5532_SendByte(0XFF);
CS5532_SendByte(0XFE);
CS5532Delay(50);
Nop();Nop();
CS5532_SendByte(0X03);//复位RS位
CS5532_SendByte(0X21);
CS5532_SendByte(0X80);
CS5532_SendByte(0X00);
CS5532_SendByte(0X00);
CS5532Delay(50);
Nop();Nop();
CS5532_SendByte(0x0b); //从物理通道1配置寄存器读
//while(rec1!=0x10)//检验物理通道1配置寄存器RV位
// {
rec1=CS5532ReadByte( );
rec2=CS5532ReadByte( );
rec3=CS5532ReadByte( );
rec4=CS5532ReadByte( );
// }
while(1)//转换程序,调试用…
{
}
我用示波器抓波形的时候,当我发送“CS5532_SendByte(0x0b); //从物理通道1配置寄存器读”这条指令,只要SDO有输出,基本能读出0X10000000,但是有时候抓波形的时候,发送这条指令,SDO没有输出,感觉上像是5532没有反应过来,您是如何解决这个问题的,时序我查很多遍了,很不解,希望看到的也能谈谈自己的想法…谢谢拉!!! 为什么我的读回来是0X88 00 00 00呢,再读一次是0XFFFFFFFF,再读就都是0了,请高手们指点一下 stm8 I/O口模拟时序,,,一点头绪都没有,LZ现在还搞好了?拿来参考下.
页:
[1]