c语言sscanf函数的用法是什么
401
2022-11-17
应广单片机系列——用I2C接口读写EEPROM
本例仅供参考,欢迎指正程序中的问题
//byteXmsbytems_cnt
//bytetest_addrbytetest_data
.romadr0x000gotomain0gotomain1
.romadr0x010isr_entry:pushafintrq = 0popafreti
//----------------------------//产生START信号//----------------------------i2c_start:I2C_SDA_OUTPUTI2C_SCL_OUTPUTI2C_SDA_HIGHdelayI2C_LONG_DLYI2C_SCL_HIGHdelayI2C_LONG_DLYI2C_SDA_LOWdelayI2C_LONG_DLYI2C_SCL_LOWdelayI2C_LONG_DLYret
//----------------------------//产生STOP信号//----------------------------i2c_stop:I2C_SCL_LOWdelayI2C_LONG_DLYI2C_SDA_LOWdelayI2C_LONG_DLYI2C_SCL_HIGHdelayI2C_LONG_DLYI2C_SDA_HIGHdelayI2C_LONG_DLY//I2C_SCL_INPUTI2C_SDA_INPUTret
//----------------------------//检查SALVE ACK信号//----------------------------i2c_slave_ack://don't check ACKI2C_SDA_INPUTdelayI2C_SHORT_DLYI2C_SCL_HIGHdelayI2C_SHORT_DLYI2C_SCL_LOWdelayI2C_SHORT_DLYI2C_SDA_OUTPUTI2C_SDA_LOWdelayI2C_SHORT_DLYret
//----------------------------//输出MASTER ACK信号//----------------------------i2c_master_ack:I2C_SDA_OUTPUTI2C_SDA_LOWdelayI2C_SHORT_DLYI2C_SCL_HIGHdelayI2C_SHORT_DLYI2C_SCL_LOWdelayI2C_SHORT_DLYret
//----------------------------//输出MASTER NACK信号//----------------------------i2c_master_nack:I2C_SDA_OUTPUTI2C_SDA_HIGHdelayI2C_SHORT_DLYI2C_SCL_HIGHdelayI2C_SHORT_DLYI2C_SCL_LOWdelayI2C_SHORT_DLYret
//------------------------------//写一个字节//Input: i2c_rw_temp//Used: i2c_rw_cnt//------------------------------i2c_write_8bit:i2c_rw_cnt = 8i2c_write_8bit_loop:slci2c_rw_tempswapcI2C_SDAdelayI2C_SHORT_DLYI2C_SCL_HIGHdelayI2C_SHORT_DLYI2C_SCL_LOWdelayI2C_SHORT_DLYdzsni2c_rw_cntgotoi2c_write_8bit_loopret
//------------------------------//读一个字节//Used: i2c_rw_cnt//Output: i2c_rw_temp//------------------------------i2c_read_8bit:i2c_rw_temp = 0i2c_rw_cnt = 8delayI2C_SHORT_DLYi2c_read_8bit_loop:I2C_SCL_HIGHdelayI2C_SHORT_DLYswapcI2C_SDAslci2c_rw_tempI2C_SCL_LOWdelayI2C_SHORT_DLYdzsni2c_rw_cntgotoi2c_read_8bit_loopret
//------------------------------//Input: i2c_rw_addr// i2c_rw_cmd//Used: i2c_rw_cnt// i2c_rw_temp//Output: i2c_rw_byte//------------------------------i2c_read_byte://startcalli2c_start
//write device address(write)i2c_rw_temp = i2c_rw_cmdcalli2c_write_8bit
//slave ackcalli2c_slave_ack
//write register addressi2c_rw_temp = i2c_rw_addrcalli2c_write_8bit
//slave ack//don't check ACKcalli2c_slave_ack
//start repeatcalli2c_start
//write device address(read)i2c_rw_temp = i2c_rw_cmdi2c_rw_temp.0 = 1calli2c_write_8bit
//slave ack//don't check ACKI2C_SDA_INPUTdelayI2C_SHORT_DLYI2C_SCL_HIGHdelayI2C_SHORT_DLYI2C_SCL_LOWdelayI2C_SHORT_DLY//这里为特殊情况I2C_SDA不用转为输出
//read datai2c_rw_temp = 0calli2c_read_8biti2c_rw_byte = i2c_rw_temp//store data
//master nackcalli2c_master_nack
//stopcalli2c_stop
//retunedelayI2C_LONG_DLYwdresetret
//------------------------------//Input: i2c_rw_addr// i2c_rw_byte// i2c_rw_cmd//Used: i2c_rw_cnt// i2c_rw_temp//------------------------------i2c_write_byte://startcalli2c_start
//write device addressi2c_rw_temp = i2c_rw_cmdcalli2c_write_8bit
//slave ack//don't check ACKcalli2c_slave_ack
//write register addressi2c_rw_temp = i2c_rw_addrcalli2c_write_8bit
//slave ack//don't check ACKcalli2c_slave_ack
//write datai2c_rw_temp = i2c_rw_bytecalli2c_write_8bit
//slave ack//don't check ACKcalli2c_slave_ack
//stopcalli2c_stop
//retunedelayI2C_LONG_DLYwdresetret
EEPROM_RW_CMDequ0xA0//------------------------------//函数名: eeprom_read_byte//Input: i2c_rw_addr//Used: i2c_rw_cnt// i2c_rw_temp//Output: i2c_rw_byte//------------------------------eeprom_read_byte:i2c_rw_cmd = EEPROM_RW_CMDgotoi2c_read_byte//注意这里用的是跳转//------------------------------//函数名: eeprom_write_byte//Input: i2c_rw_addr// i2c_rw_byte//Used: i2c_rw_cnt// i2c_rw_temp//注意: 调用完后需要等待一段时间以保证写操作完成//------------------------------eeprom_write_byte:i2c_rw_cmd = EEPROM_RW_CMDgotoi2c_write_byte//注意这里用的是跳转
disgintinten = 0
pa = 0b0000_0000paph = 0b1101_0000pac = 0b0000_0001pb = 0b0000_0000pbph = 0b0000_0000pbc = 0b1111_1111
I2C_SDA_INPUTI2C_SCL_INPUT
delay200
mova,0b100_11_111movt16m,a
clkmd.1 = 1//enable watch dogwdreset
Xms = 100calldelayXms
test_data = 0test_addr = 0
main0_loop:wdreset
//写E2EPROMi2c_rw_addr = test_addri2c_rw_byte = test_datacalleeprom_write_byte
//调用EEPROM写操作函数后要等待一段时间,以保证数据写操作完成Xms = 20calldelayXms
//读E2EPROMi2c_rw_addr = test_addrcalleeprom_read_byteif(i2c_rw_byte != test_data){//读回的数据比较出错,判断为读写E2PROM出错nop}
test_addr ++test_data --
gotomain0_loop
//----------------FPPA1-------------------main1:sp = 52main1_loop:gotomain1_loop
本例代码是从实际程序中移植而来,已编译,未做最终调试
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~