[mw_shl_code=c,true]INTERRUPT_HANDLER(TLI_IRQHandler, 0)
{
GPIOD->CR2 &= ~0x80; //禁止PD7外部中断
/* 低电平,表示当前为下降沿触发的中断 */
if( !(GPIOD->IDR & 0x80) )
{
SPI_ITConfig(SPI_IT_RXNE, ENABLE);
/* 使能SPI(SPE位) */
SPI_Cmd(ENABLE);
UART2_SendString("SPI has be enabled.\n");
}
GPIOD->CR2 |= 0x80;
}[/mw_shl_code]
如上,这是从机PD7口的中断,PD7配置为上拉输入(浮空输入也尝试过了)。
主机代码:
[mw_shl_code=c,true]void main(void)
{
/* ------------定义变量 ------------ */
/* --------------------------------- */
/* 配置CPU时钟为16MHz */
SystemInit();
LED_GPIO_Config();
UART2_Configuration();
/* 多机通信使用的地址分配使能线,默认高电平 */
Slave1_ADEN_Config();
SPI_Master_Config();
GPIO_WriteLow(ADEN_GPIO_PORT, ADEN_GPIO_PIN);
while(1)
{ [/mw_shl_code]
[mw_shl_code=c,true] }[/mw_shl_code]
main()先拉低ADEN_GPIO_PIN,也就是PD7, 然后进入while循环,这样的话每次主机上电从机中断被触发一次,串口打印“SPI has be enabled.\n”一次。
但是,一旦我在while(1)循环中加入SPI的发送代码。。SPI_SendByte(data);随便一个数据
那运行起来以后就是串口不断打印“SPI has be enabled.\n”,也就是说中断重复进入,从机的PD7口状态被SPI传输影响。
我换了其他口中断也是这样,现在暂时的解决方法是,主机上电拉低从机的PD7,延时一会,再拉高,才可以无视SPI的影响。
代码如下:
[mw_shl_code=c,true]GPIO_WriteLow(ADEN_GPIO_PORT, ADEN_GPIO_PIN);
/* 必须拉高,因为SPI传输会影响PD7状态,原因不明 */
Delay(255);
GPIO_WriteHigh(ADEN_GPIO_PORT, ADEN_GPIO_PIN);[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]求解释啊....这到底是为啥?简直心塞[/mw_shl_code]
|