[ZLG-MCU] 给一个LM3s控制ZLG7290的程序吧

[复制链接]
6058|7
 楼主| lzh08 发表于 2008-1-18 17:37 | 显示全部楼层 |阅读模式
我现在调试,总是不能进入I2C中断。
zlgarm 发表于 2008-1-18 18:25 | 显示全部楼层

我们网上有例程:LM3S系列单片机扩展按键、数码管及RTC应用笔

http://www.zlgmcu.com/download/downs.asp?ID=2152
 楼主| lzh08 发表于 2008-1-18 18:51 | 显示全部楼层

我就是按照那个例程作的,但是存在以下问题

1.还没有按键,就进入中断。<br />2,如果按键,则进入中断好几次。<br />3.不进入I2c中断<br />硬件情况如下:ZLG7290,匹配电容12p,晶振&nbsp;2M(立式无源)<br />端口情况如下<br />#define&nbsp;KEY_SCL&nbsp;GPIO_PIN_2&nbsp;//pb2&nbsp;<br />#define&nbsp;KEY_SDA&nbsp;GPIO_PIN_3&nbsp;//pb3<br />#define&nbsp;KEY_RST&nbsp;GPIO_PIN_4&nbsp;//pF4&nbsp;键盘复位&nbsp;安全起见,通过IO口复位<br />#define&nbsp;KEY_INT&nbsp;GPIO_PIN_3&nbsp;//pF3&nbsp;键盘中断,连接到port&nbsp;f&nbsp;的pin3<br />设置速率为10000<br />软件设置如下<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能所使用的外设<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);<br />&nbsp;&nbsp;//&nbsp;配置相关引脚,以进行I2C&nbsp;操作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;GPIOPinTypeI2C(GPIO_PORTB_BASE,&nbsp;KEY_SCL&nbsp;|&nbsp;KEY_SDA);<br />&nbsp;&nbsp;/*&nbsp;&nbsp;配置KEY_RST管脚为上拉,2MA输出*/<br />&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTF_BASE,&nbsp;KEY_RST&nbsp;,&nbsp;GPIO_DIR_MODE_OUT);&nbsp;&nbsp;<br />&nbsp;&nbsp;GPIOPadConfigSet(GPIO_PORTF_BASE,&nbsp;KEY_RST&nbsp;,GPIO_STRENGTH_4MA,GPIO_PIN_TYPE_STD);&nbsp;&nbsp;<br />&nbsp;&nbsp;/* 设置KEY_INT为2MA,上拉输入&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;GPIOPadConfigSet(GPIO_PORTF_BASE,&nbsp;KEY_INT,&nbsp;GPIO_STRENGTH_2MA,&nbsp;GPIO_PIN_TYPE_STD_WPU);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTF_BASE,&nbsp;KEY_INT,&nbsp;GPIO_DIR_MODE_IN);&nbsp;&nbsp;<br />&nbsp;&nbsp;//RESET<br />&nbsp;&nbsp;zlg7290Reset();&nbsp;<br />&nbsp;&nbsp;//使能中断引脚<br />&nbsp;&nbsp;GPIOIntTypeSet(GPIO_PORTF_BASE,&nbsp;KEY_INT,&nbsp;GPIO_FALLING_EDGE);/*设置KEY_INT中断的触发方式为下降沿触发*/&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;GPIOPinIntEnable(GPIO_PORTF_BASE,&nbsp;KEY_INT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;KEY_INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;IntEnable(INT_GPIOF);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;使能GPIO&nbsp;Pf&nbsp;口中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;<br />&nbsp;&nbsp;//配置I2c为主机,低速输入<br />&nbsp;&nbsp;I2CMasterSetClk(spd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;使能处理器中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;IntMasterEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;使能I2C&nbsp;中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;IntEnable(INT_I2C0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;使能I2C&nbsp;主机中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;I2CMasterIntEnable(I2C0_MASTER_BASE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;设置I2C&nbsp;中断的优先级&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;IntPrioritySet(INT_I2C0,&nbsp;(pri&nbsp;&lt&lt&nbsp;5));<br />&nbsp;&nbsp;//设置key的优先级<br />&nbsp;&nbsp;IntPrioritySet(GPIO_PORTF_BASE,&nbsp;((pri&nbsp;+&nbsp;1)&lt&lt&nbsp;5));<br />这样有什么问题么?<br />我实在看不出来啊<br />
hotpower 发表于 2008-1-18 19:03 | 显示全部楼层

我认为IntMasterEnable()应该放在mainloop前

俺认为次序很重要,否则IntMasterEnable();后立即会进入某个中断~~~<br />//初始化.........<br />//开中断分开关<br />//清除分中断标志<br />IntMasterEnable();//开总开关<br />while(1)<br />{<br />}
hotpower 发表于 2008-1-19 03:20 | 显示全部楼层

为何I2C的整个例程中没有读过I2CMCS???不解

难道DriverLib里只有I2CSlaveStatus()没有I2CMasterStatus()就不读I2CMCS???<br /><br />unsigned&nbsp;long<br />I2CMasterStatus(unsigned&nbsp;long&nbsp;ulBase)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Check&nbsp;the&nbsp;arguments.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT((ulBase&nbsp;==&nbsp;I2C0_MASTER_BASE)&nbsp;||&nbsp;(ulBase&nbsp;==&nbsp;I2C1_MASTER_BASE));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Return&nbsp;the&nbsp;Master&nbsp;status.<br />&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;return(HWREG(ulBase&nbsp;+&nbsp;I2C_O_MCS));<br />}<br /><br /><br />俺感觉只靠人为的状态机不结合硬件状态感觉不塌实~~~感觉有点蛮干的味道~~~
hotpower 发表于 2008-1-19 03:31 | 显示全部楼层

哈哈~~~现在明白4楼的问题在于6楼的说法成立~~~

看来LM的I2C状态也和PIC的I2C不规范~~~真不如LPCARM/AVR守规矩~~~<br /><br />不过,硬件状态结合软件状态机才是&quot;硬道理&quot;~~~<br /><br />俺没没正式做LM菜鸟~~~下周做了再说吧~~~ <br /> 相关链接:<a href='https://bbs.21ic.com/club/bbs/list.asp?boardid=27&t=2809345'>https://bbs.21ic.com/club/bbs/list.asp?boardid=27&t=2809345</a>
hotpower 发表于 2008-1-21 01:46 | 显示全部楼层

感觉I2CMasterInitExpClk()只能设置2个频率有点少

看来只有自己增加个I2CMasterInitFreq(unsigned&nbsp;long&nbsp;ulBase,&nbsp;unsigned&nbsp;long&nbsp;ulI2CClk,&nbsp;unsigned&nbsp;long&nbsp;ulSCLFreq)才能满足不同频率的要求
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

114

帖子

0

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