打印
[ZLG-MCU]

给一个LM3s控制ZLG7290的程序吧

[复制链接]
4652|7
手机看帖
扫描二维码
随时随地手机跟帖
沙发
zlgarm| | 2008-1-18 18:25 | 只看该作者

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

http://www.zlgmcu.com/download/downs.asp?ID=2152

使用特权

评论回复
板凳
lzh08|  楼主 | 2008-1-18 18:51 | 只看该作者

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

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

使用特权

评论回复
地板
hotpower| | 2008-1-18 19:03 | 只看该作者

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

俺认为次序很重要,否则IntMasterEnable();后立即会进入某个中断~~~
//初始化.........
//开中断分开关
//清除分中断标志
IntMasterEnable();//开总开关
while(1)
{
}

使用特权

评论回复
5
hotpower| | 2008-1-19 03:20 | 只看该作者

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

难道DriverLib里只有I2CSlaveStatus()没有I2CMasterStatus()就不读I2CMCS???

unsigned long
I2CMasterStatus(unsigned long ulBase)
{
    //
    // Check the arguments.
    //
    ASSERT((ulBase == I2C0_MASTER_BASE) || (ulBase == I2C1_MASTER_BASE));

    //
    // Return the Master status.
    //
    return(HWREG(ulBase + I2C_O_MCS));
}


俺感觉只靠人为的状态机不结合硬件状态感觉不塌实~~~感觉有点蛮干的味道~~~

使用特权

评论回复
6
hotpower| | 2008-1-19 03:31 | 只看该作者

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

看来LM的I2C状态也和PIC的I2C不规范~~~真不如LPCARM/AVR守规矩~~~

不过,硬件状态结合软件状态机才是"硬道理"~~~

俺没没正式做LM菜鸟~~~下周做了再说吧~~~
相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=27&t=2809345

使用特权

评论回复
7
hotpower| | 2008-1-21 01:46 | 只看该作者

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

看来只有自己增加个I2CMasterInitFreq(unsigned long ulBase, unsigned long ulI2CClk, unsigned long ulSCLFreq)才能满足不同频率的要求

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

114

帖子

0

粉丝