|
(原文件名:截图115.jpg)
上面是手册上的SPI时序图,手册上面的描述如下:
如果CPHA(时钟相位)被置“1”,SCK时钟的第二个边缘(CPOL=0为下降沿,CPOL=1为上升沿)进行最高数据位采样,数据在第一个时钟传送周期被锁存。
如果CPHA(时钟相位)被置“0”,SCK时钟的第一个边缘(CPOL=0为下降沿,CPOL=1为上升沿)进行数据位采样,数据在第二个时钟传送周期被所存。
为什么CPHA=1的时候,数据是在第二个边沿采样,数据却在第一个时钟被所存,
而 CPHA=0的时候,数据是在第一个边沿采样,数据却在第二个时钟被所存,
这个如何理解啊?
下面是我现在要用的一个AD芯片的SPI时序图:
(原文件名:截图116.jpg)
再附上CS1880手册:
CS1180手册ourdev_599321O2H2TJ.pdf(文件大小:549K) (原文件名:cs1180 datasheetv2[1].3_cn.pdf)
请问根据这两个东东我应该怎么设置CPOL和CPHA啊,按我的理解是应该CPOL=1,CPHA=1,但是怎么弄读数据都不对啊。我也尝试了CPOL=1,CPHA=0.读出的数据还是不对。
下面是写的简单的测试代码,往CS1180里面写一个数,然后再读出来,怎么试都不行,大家帮忙看看!!
void Ini_SPI(void)
{
SPI_CR1_BR = bx0000_0010;
asm("nop");
SPI_CR1_MSTR = 1;
SPI_CR1_CPOL = 1;
SPI_CR1_CPHA = 1;
SPI_CR2 = bx0000_0011;
}
SPI_CR1_SPE = 1;
SPI_Command[0] = 0x50;
SPI_Command[1] = 0x00;
SPI_Command[2] = 0x01;
SPI_Command[3] = 0x00;
asm("nop");
for(_uchar i=0;i<3;i++)
{
while(!SPI_SR_TXE) asm("nop");
SPI_DR = SPI_Command;
}
Delay_us(30);
SPI_Command[0] = 0x10;
SPI_Command[1] = 0x00;
SPI_Command[2] = 0x00;
for(_uchar i=0;i<3;i++)
{
while(!SPI_SR_TXE) asm("nop");
SPI_DR = SPI_Command;
while(!SPI_SR_RXNE) asm("nop");
SPI_Data = SPI_DR;
if(i==1)
{
Delay_us(90);
}
en_disp(6,0,3,asc,Hex2BCD(SPI_Data[2]&0x07,3),1); //这里是一个液晶显示函数
}
if(SPI_Command[2]<7) SPI_Command[2]++;
else SPI_Command[2] = 0; |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|