运用单片机操控ZL30151输出时钟,引脚衔接联系如下:
其间A1、A0是作为复用器的地址线信号,ZL30151 SPI形式下的有用管脚如下:
CSN(IF0)、SCLK(SCL)、RSTN、MOSI(SDA)、MISO(IF1)、AC0(GPIO0)、AC1(GPIO1)(这些管脚中的RSTN、AC0、AC1由FPGA操控),括号内是管脚的第二功用,首要用于芯片复位时的形式设置,详细到SPI形式:在RSTN的上升沿,IF1、IF0要置1,AC0、AC1置0。别的RSTN在上电之后要有一个复位的进程,需求拉低至少100ns。而RSTN是在FPGA端操控的,所以需求单片机和FPGA一起操控,办法是单片机项FPGA的寄存器写一个值,然后FPGA就将对应的管脚拉低或置1。SPI形式设置就要在单片机给FPGA发送赋值恳求前,将IF1、IF0管脚的值准备好。问题便是在这儿呈现的。
程序经过编译,下到单片机,可是ZL30151的时钟没有出来,然后进入debug形式找问题。
int main()
{
init_devices();
init_pll();
PLL3_init();
unsigned char f_read = FPGA_read(0x3b00);
……
return 0;
}
首要置疑和FPGA的接口有问题,读寄存器的值,看是否写入进去,可是显现一直是0,然后打断点调试:
unsigned char f_read = FPGA_read(0x3b00);在这一句打断点,成果程序底子没跑到这儿,然后将断点往上打,
PLL3_init();程序运转到断点这儿,再点向下运转,程序就跑飞了,问题出在PLL3_init();然后在PLL3_init()函数里打断点,
DDRD = 0x3f;
//X,X,SEL_A1,SEL_A0,MISO(IF1),MOSI(SDA),SCLK(SCL),CSN(IF0)
PORTD = 0x19;在这儿程序居然跑飞了。
这儿仅仅一个简略的给管脚赋值的句子,实在是看不出有什么问题,何况在init_devices();这个函数里边也有给管脚赋值的句子,并没有问题。百思不得其解,讨教单位的大牛王总,过来之后冷眼一扫,看到Port0、1、2、3复用了中止功用,并且在init_devices();里边是使能了INT0和INT1的,就判别应该是中止引起的。然后刚好我在给PORT管脚赋值的时分将INT0置为高了,所以程序就进入了中止程序,可是本项目工程里并没有写INT0的中止函数(没有中止函数还把中止使能翻开,这便是不动脑筋复制粘贴的结果),所以程序就跑飞了。
**关于单片机的中止引脚,手册里是这样规则的:只需使能了中止,即便引脚INT7:0装备为输出,只需电平发生了适宜的改变,中止也会触发。
所以尽管将引脚装备为输出引脚,也依然引发了中止。