;; ;; mur.sat ;; ;; Somewhen in the year 2012, mur.at will have a nano satellite launched ;; into a low earth orbit (310 km above the surface of our planet). The ;; satellite itself is a TubeSat personal satellite kit, developed and ;; launched by interorbital systems. mur.sat is a joint venture of mur.at, ;; ESC im Labor and realraum. ;; ;; Please visit the project hompage at sat.mur.at for further information. ;; ;; ;; Copyright (C) 2011 Christian Pointner ;; ;; This file is part of mur.sat. ;; ;; mur.sat is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; any later version. ;; ;; mur.sat is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with mur.sat. If not, see . ;; ;; ------------------------------------- i2c_init bsf STATUS,RP0 ; make them outputs first bcf I2C_SDA ; every write access is read-update-write bcf I2C_SCL ; therefore the second bcf SDA sets SCL again bcf STATUS,RP0 ; because of the external pull-up bcf I2C_SCL bcf I2C_SDA bsf STATUS,RP0 bsf I2C_SDA bsf I2C_SCL bcf STATUS,RP0 return ;; ------------------------------------- i2c_start bsf STATUS,RP0 bcf I2C_SDA nop bcf I2C_SCL bcf STATUS,RP0 return ;; ------------------ i2c_restart bsf STATUS,RP0 bsf I2C_SDA nop bsf I2C_SCL nop nop nop bcf I2C_SDA nop bcf I2C_SCL bcf STATUS,RP0 return ;; ------------------ i2c_stop bsf STATUS,RP0 bsf I2C_SCL nop bsf I2C_SDA bcf STATUS,RP0 return ;; ------------------ i2c_send_byte movwf I2C_BYTE movlw .8 movwf I2C_BIT_CNT bsf STATUS,RP0 i2c_send_byte_next btfss I2C_BYTE,7 bcf I2C_SDA btfsc I2C_BYTE,7 bsf I2C_SDA nop bsf I2C_SCL nop nop bcf I2C_SCL rlf I2C_BYTE,f decfsz I2C_BIT_CNT,f goto i2c_send_byte_next nop nop bsf I2C_SDA bsf I2C_SCL bcf STATUS,RP0 movf I2C_PORT,w bsf STATUS,RP0 bcf I2C_SCL bcf I2C_SDA bcf STATUS,RP0 andlw I2C_SDA_MASK movwf I2C_BYTE swapf I2C_BYTE,f return ;; ------------------ i2c_recv_byte clrf I2C_BYTE movlw .8 movwf I2C_BIT_CNT bsf STATUS,RP0 bsf I2C_SDA i2c_recv_byte_loop bsf I2C_SCL bcf STATUS,RP0 btfsc I2C_SDA bsf I2C_BYTE,0 bsf STATUS,RP0 bcf I2C_SCL decfsz I2C_BIT_CNT,f goto i2c_recv_byte_next bcf I2C_SDA bcf STATUS,RP0 return i2c_recv_byte_next bcf STATUS,C rlf I2C_BYTE,f goto i2c_recv_byte_loop ;; ------------------ i2c_ack bsf STATUS,RP0 bcf I2C_SDA bsf I2C_SCL nop nop bcf I2C_SCL bcf STATUS,RP0 return ;; ------------------ i2c_nack bsf STATUS,RP0 bsf I2C_SDA bsf I2C_SCL nop nop bcf I2C_SCL bcf I2C_SDA bcf STATUS,RP0 return ;; -------------------------------------