首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

HC08的MMIIC模块,状态、标识很多但用途不大

HC08的MMIIC模块,状态、标识很多但用途不大

HC08的MMIIC模块,状态、标识很多但用途不大,实际上比用IO模拟省不了太多的事


如MMRXIF与MMRXBF用途相似、MMTXIF与MMTXBE相似、MMRXAK没有将ACK和用户挂钩,不能通过读MMRXAK来判定发出的数据是否收到


事实上,这个模块的不确定性太多了,你的发送缓冲区都空了,甚至将MMAST由1改为0了,模块还在发送数据。这个时候虽然程序上早就完成了上一次数据传输,实际上单片机还在往外发数据。如果这时将MMIIC模块Disable掉,本次的数据发送就失败了……应该提供一个数据发送完毕标志,却没必要弄太多罗里罗嗦的东西。


 边凿磨边用
 
 经验同分享
强烈希望Freescale提供HC08 MMIIC模块对常用IIC器件的读写例程,C或汇编都可以,以充分发挥芯片设计者的意图。
我也感到与其他单片机的IIC模块相比,HC08的MMIIC模块特别难用,但是我还是希望使用HC08的MMIIC模块,毕竟IO模拟IIC口线时,因需软件延时,对IIC器件操作时占用CPU时长与程序长度较长。
CW中就有例程,只是没有怎么讲 所以然,有些操作不是十分理解
并且硬件的IIC也省不了什么时间,在发送或接受数据时单片机基本上只能等待……
fs对一些模块的解说确实不是太详细
对MMIIC我用软、硬仿真加示波器才弄明白怎么回事;实际上使用MMIIC进行可靠的通信非常罗嗦

 边凿磨边用
 
 经验同分享
我用MMIIC就直接用beans来做,很省事,PE网站上还有驱动24XXX的bean下载,看过bean生成的代码很快就弄明白了

[此贴子已经被作者于2006-8-17 13:44:03编辑过]

根据我的仿真测试,MMRXAK位也是未与从器件挂钩,好像在发送时钟的第9位HC08想当然地将MMRXAK置位,因而读写程序中不能通过读MMRXAK来判定发出的数据是否收到,只能根据MMTXIF或MMTXBE标志来决定何时发送下一位数据。
另外mmiic在读数据时在倒数第二个数据时置停止信号及发送从器件地址时须发送一个空数据均不是很好理解。
楼上说CW中就有例程与PE网站上还有驱动24XXX的bean下载,不知能否提供详细栏目地址,不胜感谢。
bean不大好用啊,能生成驱动代码吗?好像不行。

 边凿磨边用
 
 经验同分享
是pe还是p&e?

 边凿磨边用
 
 经验同分享

beans下载
硬体驱动类:
http://www.processorexpert.com/mcHC08ebhw.php
软体算法类:
http://www.processorexpert.com/mcHC08ebsw.php
注意:使用24XXX的bean前提条件是设置好MMIIC的bean(有软模拟和硬件MMIIC两种)

license的限制会影响beans许用的总数和功能

[此贴子已经被作者于2006-8-18 13:44:46编辑过]

谢谢,是processorexpert,我看一下

 边凿磨边用
 
 经验同分享

下载了EEPROM_I2C_24xxx[2_98_hcs08,2_96_hcs12].PEupd,如何打开使用?

是否能将生成代码贴上来,谢谢! 

[此贴子已经被作者于2006-8-19 17:34:53编辑过]

用菜单Processor Expert->Update->Update Processor Expert from Package...打开下载的*.PEupd文件,完成更新后,用Bean Selector->Categories标签->CPU Exterinal Devices->Memory->双击EEPROM_I2C_24xxx这个bean加入你的项目进行设置生成代码即可。
我那个生成代码多达300行,这里只贴两个函数供参考:
byte EEPROM_ReadByte(EEPROM_TAddress Addr,TPtrByte Data)
{
if (Addr > 0x01FF){ /* too long (> 1 x 0x0200) */
return(ERR_RANGE);
}
/* CW contains memory code | device address | (part of) word address */
EEPROM_CW = 0x50 | 0x00 | (Addr & 0x0100) >> 8;
CHECK_ERR(IIC_SelectSlave(EEPROM_CW));
CHECK_ERR(IIC_SendChar((byte)Addr)); /* every byte-write begins with address */
CHECK_ERR(IIC_RecvChar(Data));

return(ERR_OK);
}

byte EEPROM_WriteByte(EEPROM_TAddress Addr,byte Data)
{
byte abuff[2];

if (Addr > 0x01FF){ /* too long (> 1 x 0x0200) */
return(ERR_RANGE);
}
/* CW contains memory code | device address | (part of) word address */
EEPROM_CW = 0x50 | 0x00 | (Addr & 0x0100) >> 8;
CHECK_ERR(IIC_SelectSlave(EEPROM_CW));
abuff[0] = (byte)(Addr & 0xFF); /* every byte-write begins with address */
abuff[1] = Data;
CHECK_ERR(IIC_SendBlock(abuff, 2, &EEPROM_Copies)); /* Send address and data to EEPROM */

return(ERR_OK);
}
谢谢了!
返回列表