I2C’Ê�M‚ÌŽg‚¢•û


�yI2C’Ê�M�z

�@I2C�iInter-Integrated Circuit�j‚Í�AƒtƒBƒŠƒbƒvƒXŽÐ‚ª’ñ�¥‚µ‚½Žü•ÓƒfƒoƒCƒX
‚Ƃ̃VƒŠƒAƒ‹’Ê�M‚Ì•ûŽ®‚Å�AŽå‚ÉEEPROMƒ�ƒ‚ƒŠIC‚ȂǂƂÌ�‚‘¬’Ê�M‚ðŽÀŒ»
‚·‚é•ûŽ®‚Å‚·�B

�@�sŽQ�Æ�tƒtƒBƒŠƒbƒvƒXŽÐ‚ÌI2C‚̉p•¶‚ÌŽd—l�‘‚͉º‹L‚©‚çƒ_ƒEƒ“ƒ��[ƒh
�@�@�@�@�@‚Å‚«‚Ü‚·

�@�@�@
�šƒtƒBƒŠƒbƒvƒXŽÐI2Cƒz�[ƒ€ƒy�[ƒW

�@‚±‚Ì“–�‰‚Ì–Ú“I‚©‚ç�„’肳‚ê‚邿‚¤‚É�AI2C‚Í“¯‚¶Šî”“à‚Ȃǂ̂悤‚ɋߋ——£
‚Å’¼Œ‹‚µ‚½ƒfƒoƒCƒX‚Æ�A100kbps‚Ü‚½‚Í400kbps‚Ì‘¬“x‚ŃVƒŠƒAƒ‹’Ê�M‚ð�s‚¤‚悤
‚ÉŽg‚í‚ê‚é‚Ì‚ªŽå‚Å�A—£‚ꂽ‘•’uŠÔ‚Ì’Ê�M‚ɂ͌ü‚¢‚Ä‚¢‚Ü‚¹‚ñ�B
�@I2C‚Í�Aƒ}ƒXƒ^‘¤‚ƃXƒŒ�[ƒu‘¤‚𖾊m‚É•ª‚¯�Aƒ}ƒXƒ^‘¤‚ª‘S‚Ä‚Ì�§Œä‚̎哱Œ 
‚ðŽ�‚Á‚Ä‚¢‚Ü‚·�B
�@I2C‚̓p�[ƒeƒB�[ƒ‰ƒCƒ“�\�¬‚ª‰Â”\‚ƂȂÁ‚Ä‚¨‚è�A‚P‚‚̃}ƒXƒ^‚Å•¡�”‚̃XƒŒ�[ƒu
ƒfƒoƒCƒX‚Æ’Ê�M‚·‚邱‚Æ‚ª‰Â”\‚Å‚·�B

�@‚Ü‚¸I2C’Ê�M‚Ì‚µ‚­‚݂͉º�}‚Ì�\�¬‚ðŠî–{‚Æ‚µ‚Ä‚¢‚Ü‚·�B
�@

�@�@�}‚̂悤‚É‚P‘ä‚̃}ƒXƒ^‚Æ‚P‘ä‚Ü‚½‚Í
�@�@•¡�”‚̃XƒŒ�[ƒu‚Ƃ̊Ԃð�ASCL‚ÆSDA‚Æ
�@�@‚¢‚¤‚Q–{‚Ì�ü‚Ńp�[ƒeƒB�[ƒ‰ƒCƒ“�ó‚É
�@�@�Ú‘±‚µ‚Ü‚·�B
�@�@ƒ}ƒXƒ^‚ª�í‚ÉŒ ŒÀ‚ðŽ�‚Á‚Ä‚¨‚è�Aƒ}ƒXƒ^
�@�@‚ª‘—�M‚·‚éƒNƒ�ƒbƒN�M�†SCL‚ðŠî�€‚É
�@�@‚µ‚Ä�Aƒf�[ƒ^�M�†‚ªSDAƒ‰ƒCƒ“�ã‚Å“]‘—
�@�@‚³‚ê‚Ü‚·�B



�@’Ê�M•ûŽ®‚Å—ÞŽ—‚ÌSPI‚Ƒ傫‚­ˆÙ‚È‚é‚Ì‚Í�AŒÂ�X‚̃XƒŒ�[ƒu‚ªƒAƒhƒŒƒX‚ðŽ�‚Á‚Ä
‚¢‚Ä�Aƒf�[ƒ^‚Ì’†‚ɃAƒhƒŒƒX‚ªŠÜ‚Ü‚ê‚Ä‚¢‚邱‚Æ‚Æ�A‚PƒoƒCƒg“]‘—–ˆ‚ÉŽó�M‘¤‚©‚ç
ACK�M�†‚̕ԑ—‚ð‚µ‚Ä�AŒÝ‚¢‚ÉŠm”F‚ðŽæ‚è‚È‚ª‚çƒf�[ƒ^“]‘—‚ð�s‚Á‚Ä‚¢‚邱‚Ƃł·�B


�@SSP‚ðI2Cƒ‚�[ƒh‚ÅŽg‚¤Žž‚Ì’Ê�MŽè�‡‚ÌŠî–{‚Í�ASCL‚ÆSDA‚Ì‚Q–{‚Ì�M�†�ü
‚Å‚·‚ׂẴf�[ƒ^‚Ì‘—Žó�M‚ð�s‚¢‚Ü‚·�B
�@SCLƒsƒ“�ASDAƒsƒ“‚Æ‚à‚É•¡�”‚̃XƒŒ�[ƒu‚ð�Ú‘±‚µ‚Ü‚·‚Ì‚Å�AI2Cƒ‚�[ƒh‚ð‘I‘ð
‚·‚邯—¼ƒsƒ“‚Æ‚àƒI�[ƒvƒ“ƒhƒŒƒCƒ“�\�¬‚ƂȂè‚Ü‚·�B
‚Ü‚½ƒXƒŒ�[ƒu‘¤‚Í—¼ƒsƒ“‚Æ‚à�펞‚Í“ü—̓‚�[ƒh‚É‚µ‚ănƒCƒCƒ“ƒs�[ƒ_ƒ“ƒX�ó‘Ô
‚É‚µ�AƒAƒhƒŒƒX‚ÅŽw’肳‚ꂽ�o—Í‚·‚éƒfƒoƒCƒX‚¾‚¯�o—̓‚�[ƒh‚É‚·‚é•K—v‚ª‚ 
‚è‚Ü‚·�B

(1)�@‚Ü‚¸ƒ}ƒXƒ^‘¤‚ª�AStart Condition‚ð�o—Í‚µ‘±‚¢‚ăAƒhƒŒƒX‚ÆRead/Write—v‹�‚ð
�@�@�@�o—Í‚µ‚Ü‚·�B
(2)�@‘SƒXƒŒ�[ƒu‚ª‚±‚ÌŽž‚ÌSCL‚̃Nƒ�ƒbƒN‚ðŒ³‚ÉSDA‚̃f�[ƒ^‚ðŽó�M‚µ�ASSPADD
�@�@�@ƒŒƒWƒXƒ^‚ɃZƒbƒg‚³‚ꂽƒAƒhƒŒƒX‚ƈê’v‚µ‚½ƒfƒoƒCƒX‚¾‚¯‚ª�A‚»‚ÌŒã‚Ì‘—Žó�M‚ð
�@�@�@Œp‘±‚µ‚Ü‚·�B
(3)�@Žó�M‚µ‚½‘¤‚ªƒf�[ƒ^‚ðŽó�MŠ®—¹‚·‚邯ީ“®“I‚ÉACKƒrƒbƒg‚ð•Ô‘—‚µ�A“¯Žž‚É
�@�@�@SSPŠ„�ž‚Ý‚ð”­�¶‚µ‚Ü‚·�B
(4)�@‚±‚ê‚ðƒ}ƒXƒ^‚ªStop Condition‚ð�o—Í‚·‚é‚܂ő±‚¯‚Ü‚·�B

�@‚±‚̂悤‚ÉI2C’Ê�M‚àƒuƒ�ƒbƒN“]‘—‚ª‚Å‚«‚Ü‚·‚Ì‚Å�A‘å—ʂ̃f�[ƒ^‚ðˆê‹C‚É“]‘—
‚·‚鎞‚ɕ֗˜‚ÉŽg‚¤‚±‚Æ‚ª�o—ˆ‚Ü‚·

�yI2C’Ê�M‚̃^ƒCƒ~ƒ“ƒO�z

�@I2C’Ê�M‚ÌŠî–{“I‚È“]‘—ƒ^ƒCƒ~ƒ“ƒO‚͉º�}‚̂悤‚ɂȂÁ‚Ä‚¢‚Ü‚·�B

(1)�@ƒ}ƒXƒ^‘¤‚ªSCL‚ªHigh‚ÌŽž‚ÉSDA‚ðLow‚É‚µ‚½‚Æ‚«‚ðƒXƒ^�[ƒgƒRƒ“ƒfƒBƒVƒ‡ƒ“
�@�@�@‚Æ‚·‚é�B
(2)�@‚»‚̌㑱‚¯‚ă}ƒXƒ^‚ªƒNƒ�ƒbƒN‚Ì‹Ÿ‹‹‚𑱂¯‚È‚ª‚çƒAƒhƒŒƒX‚ÆRead�^Write
�@�@—v‹�‚̃f�[ƒ^‚ð‘—�M‚µ‚Ü‚·�B
(3)�@‚±‚ÌŒã‚Í�AƒAƒhƒŒƒX‚ÅŽw’肳‚ꂽ‚P‘ä‚̃XƒŒ�[ƒu‚ª�Aƒ}ƒXƒ^‚Æ1‘Î1‚Å�AŽw’è
�@�@‚³‚ꂽ•ûŒü‚Å’Ê�M‚ð�s‚¢‚Ü‚·�B
�@�@‚‚܂è�ASCL‚̃Nƒ�ƒbƒN‚É�]‚Á‚Ä‘—�M‘¤‚©‚ç‚Wƒrƒbƒg‚̃f�[ƒ^‚ª�o—Í‚³‚ê�A
�@�@‘±‚¢‚ÄŽó�M‘¤‚©‚çƒAƒNƒmƒŠƒbƒW(ACK)�M�†‚ª•Ô‘—‚³‚ê‚Ü‚·�B
�@�@‚±‚ÌŽž�AŽó�M‚·‚鑤‚Í�AŽó�Mƒf�[ƒ^‚ÌŽæ‚è�o‚µ‚ªŠ®—¹‚·‚é‚Ü‚Å�AƒrƒW�[‚Æ‚µ‚Ä
�@�@SCL‚ð‹­�§“I‚ÉLow‚É‚·‚ê‚Î�A‚±‚ÌŠÔ‚ÍŒ©‚©‚¯�ãƒNƒ�ƒbƒN‚ª–³‚­‚È‚é‚Ì‚Å�A
�@�@‘—�M‘¤‚ÍŽŸ‚̃f�[ƒ^‚ð�o—Í‚·‚é‚Ì‚ð‘҂‚±‚ƂɂȂè‚Ü‚·�B
(4)�@�ÅŒã‚̃f�[ƒ^‚ð‘—‚è�I‚í‚è�AACK‚ðŠm”F‚µ‚½‚ ‚Æ�AƒXƒŒ�[ƒu‚ÍSDA‚ð‰ð•ú‚·‚é
�@�@‚Ì‚Å�Aƒ}ƒXƒ^‚ªSDA‚ðLow‚É‚µ‚ăNƒ�ƒbƒN‚ð’âŽ~‚µ‚ÄHigh‚É‚µ‚Ä‚©‚ç�ASDA‚ðHigh
�@�@‚É‚·‚邱‚ƂŃXƒgƒbƒvƒV�[ƒPƒ“ƒX‚ƂȂè’Ê�M‚ÍŠ®—¹‚µ‚Ü‚·�B

�yI2C‚Ì’Ê�Mƒf�[ƒ^ƒtƒH�[ƒ}ƒbƒg�z

�@I2C’Ê�M‚ÌŠî–{“I‚È’Ê�M‚̃f�[ƒ^ƒtƒH�[ƒ}ƒbƒg‚Í�AƒAƒhƒŒƒXƒtƒH�[ƒ}ƒbƒg‚ƃf�[ƒ^
ƒtƒH�[ƒ}ƒbƒg‚ª‚ ‚è‚Ü‚·�B
�@‚Ü‚¸ƒAƒhƒŒƒXƒtƒH�[ƒ}ƒbƒg‚͉º�}‚̂悤‚ɂȂè‚Ü‚·�BƒAƒhƒŒƒX‚ɂ͂Vƒrƒbƒgƒ‚�[ƒh‚Æ
‚P‚Oƒrƒbƒgƒ‚�[ƒh‚ª‚ ‚è�A�}’†‚Ì(a)(b)‚ª‚»‚ꂼ‚ê‚ɑΉž‚µ‚Ü‚·�B
�}’†‚ÌACKƒrƒbƒg‚ÍŽó�M‘¤‚©‚玩“®•Ô�M‚³‚ê‚éƒrƒbƒg‚Å‚·�B




�@’Ê�Mƒf�[ƒ^‘S‘̂̃tƒH�[ƒ}ƒbƒg‚͉º�}‚̂悤‚ɂȂè�Aƒ}ƒXƒ^‘¤‚ª‘—�M‘¤‚ɂȂ邩
Žó�M‘¤‚ɂȂ邩‚É‚æ‚Á‚Ä�}‚Ì(a)(b)‚̂悤‚É‚QŽí—ނ̃tƒH�[ƒ}ƒbƒg‚ƂȂè‚Ü‚·�B
‚±‚±‚Å�Aƒ}ƒXƒ^‚ªŽó�M‘¤‚ɂȂé�ê�‡‚É‚Í�A‚Ü‚¸�Å�‰‚ɃAƒhƒŒƒXƒtƒH�[ƒ}ƒbƒg‚Ì•”•ª
‚Å�AŽó�M‘¤‚ɂȂ邱‚Æ‚ð“Á’èƒXƒŒ�[ƒu‚ÉŒü‚¯‚Ä‘—�M‚µ�A‚»‚ê‚É‘±‚¢‚ÄŽw’肳‚ꂽ
ƒXƒŒ�[ƒu‚ªƒf�[ƒ^‚Ì‘—�M‚ðŽn‚߂܂·�Bƒ}ƒXƒ^‚̓f�[ƒ^‚ðŽó�M‚µ‚½‚çACK‚ð•Ô�M‚µ‚Ü‚·�B


�yCŒ¾Œê‚É‚æ‚éŽg‚¢•û�z

�@CCS CƒRƒ“ƒpƒCƒ‰‚É‚Í�AI2C’Ê�M‚ðƒTƒ|�[ƒg‚·‚é‘g�ž‚ÝŠÖ�”‚ª—pˆÓ‚³‚ê‚Ä‚¢‚Ü‚·�B
‚±‚ÌŠÖ�”‚ðŽg‚¤‚½‚߂ɂÍ�AƒvƒŠƒvƒ�ƒZƒbƒTŠÖ�”‚ÅI2C’Ê�M‚ðŽg‚¤‚±‚Æ‚ð�錾‚µ‚Ä�AŠÖ�”
ƒ‰ƒCƒuƒ‰ƒŠ‚ð‘g‚Ý�ž‚Þ•K—v‚ª‚ ‚è‚Ü‚·�B

(1) ƒvƒŠƒvƒ�ƒZƒbƒTŠÖ�”
�@I2C—p‚É—pˆÓ‚³‚ꂽƒvƒŠƒvƒ�ƒZƒbƒT‚Í�A‰º•\‚̂悤‚ɂȂÁ‚Ä‚¢‚Ü‚·�B
ƒvƒŠƒvƒ�ƒZƒbƒTŠÖ�” ‹@”\“à—e
�”USE I2C(Master�A
�@�@�@SDA=Pin,SCL=Pin options)
I2Cƒ‰ƒCƒuƒ‰ƒŠ‚ðƒŠƒ“ƒN‚µ�AI2C‚Æ‚µ‚ÄŽg—p‚·‚é“ü�o—̓sƒ“‚ð“Á’肵‚Ü‚·�B
ƒXƒŒ�[ƒuƒ‚�[ƒh‚Í“à‘ ‚ÌSSPƒ‚ƒWƒ…�[ƒ‹‚ª‚ ‚邯‚«‚̂݉”\‚ƂȂè‚Ü‚·‚ª�Aƒ}ƒXƒ^�[ƒ‚�[ƒh‚͂ǂÌPIC‚Å‚à—LŒø‚ƂȂè‚Ü‚·�B
NOFORCE_SWŽw’肪–³‚¢‚Æ‚«‚Í�Aƒvƒ�ƒOƒ‰ƒ€‚Å‹@”\‚·‚邿‚¤Ž©“®“I‚É•K—v‚ȃvƒ�ƒOƒ‰ƒ€ƒ‚ƒWƒ…�[ƒ‹‚ð�¶�¬‚µ‚Ü‚·�B

options‚̃pƒ‰ƒ��[ƒ^�i•¡�”Žw’è‰Â�j
�@MASTER�@ƒ}ƒXƒ^�[ƒ‚�[ƒh‚É‚·‚é
�@SLAVE�@�@ƒXƒŒ�[ƒuƒ‚�[ƒh‚É‚·‚é
�@SCL=Pin�@SCLƒsƒ“‚ÌŽw’è
�@SDA=Pin�@SDAƒsƒ“‚ÌŽw’è
�@ADDRESS=nn�@ƒXƒŒ�[ƒuƒ‚�[ƒh‚̃AƒhƒŒƒX‚ð�Ý’è
�@FAST�@�@�@�‚‘¬I2C‚ðŽw’è(400kpbs)
�@SLOW�@�@’ᑬI2C‚ðŽw’è(100kbps)
�@RESTRAT_WDT
�@�@�@I2C‚ÌREAD‘Ò‚¿‚ÌŠÔWDT‚ÌŽ©“®ƒŠƒZƒbƒg‚ð
�@�@�@‚·‚邿‚¤‚ÉŽw’è
�@NOFORCE_SW
�@�@�@“à‘ SSPƒ‚ƒWƒ…�[ƒ‹‚ÅI2C‚ð‹@”\‚³‚¹‚邿‚¤
�@�@�@Žw’è

�s—á�t
#USE�@I2C(master,sda=PIN_B0,scl=PIN_B1)
#USE I2C(slave,sda=PIC_C4,scl=PIC_C3
�@�@�@�@�@�@�@�@�@�@address=0xa0,NOFORCE_SW)


(2) I2C—p‘g�ž‚ÝŠÖ�”
�@‘O�€‚̃vƒŠƒvƒ�ƒZƒbƒT‚ÅI2C‚ÌŽg—p‚ðŽw’è‚·‚邯�A‰º•\‚ÌŠÖ�”‚ª‘g‚Ý�ž‚Ü‚êŽg—p
‰Â”\‚ƂȂè‚Ü‚·�B‚±‚ê‚Å�AI2C’Ê�M‚ðCŒ¾Œê‚ňµ‚¤‚±‚Æ‚ª‰Â”\‚ƂȂè‚Ü‚·�B

‘g�ž‚ÝŠÖ�”

‹@�@”\�@“à�@—e

I2C_START( ) I2C‚̃}ƒXƒ^ƒ‚�[ƒh‚ÌŽž�AStart Condition‚ð�o—Í‚·‚é�B‚±‚Ì‚ ‚ÆSCL‚ÍI2C_READ‚©I2C_WRITE‚ÌŽÀ�s‚Ü‚ÅLowƒŒƒxƒ‹‚ɕۂ½‚ê‚Ü‚·�B
I2C_STOP( ) I2C‚̃}ƒXƒ^ƒ‚�[ƒh‚ÌŽž�AStop Condition‚ð�o—Í‚µ‚Ü‚·�B’A‚µ�o—Í‚·‚邽‚߂ɂÍ�ðŒ�‚ª�®‚Á‚Ä‚¢‚邱‚Æ‚ª•K—v‚Å‚·�B—á‚ðŽQ�Æ
b=I2C_WRITE(byte) ‚PƒoƒCƒg‚̃f�[ƒ^‚ðI2C‚É�o—Í‚µ‚Ü‚·�Bƒ}ƒXƒ^‚̂Ƃ«‚Í‚±‚ê‚ŃNƒ�ƒbƒN‚ð�o—Í‚µ,ƒXƒŒ�[ƒu‚̂Ƃ«‚̓Nƒ�ƒbƒN‚ð‘Ò‚¿‚Ü‚·�B“à‘ SSPƒ‚ƒWƒ…�[ƒ‹‚ðŽg‚í‚È‚¢‚Æ‚«‚̓^ƒCƒ€ƒAƒEƒg‚Í–³‚¢‚̂ő—�MŠ®—¹‚܂ʼni‹v‘Ò‚¿‚ƂȂè‚Ü‚·�B‘—�M‚ªŠ®—¹‚·‚邯�AACKƒrƒbƒg‚ðOn‚ŕԂµ‚Ü‚·

�s—á�t
i2c_start( ); //start condition
i2c_write(0xa0); //device address
i2c_write(5); //device command send
i2c_write(12); //device data send
i2c_stop( ); //stop condition
i=I2C_READ( ) I2CƒCƒ“ƒ^�[ƒtƒF�[ƒX‚©‚çƒf�[ƒ^‚ð“Ç�ž‚݂܂·�Bƒ}ƒXƒ^ƒ‚�[ƒh‚ÌŽž‚Í‚±‚Ì–½—߂ŃNƒ�ƒbƒN‚ª�o—Í‚³‚ê‚Ü‚·‚ª�AƒXƒŒ�[ƒuƒ‚�[ƒh‚ÌŽž‚̓Nƒ�ƒbƒN�o—Í‚ð‘Ò‚¿‚Ü‚·�B
‚±‚Ì–½—߂͉i‹v‚Ƀf�[ƒ^‚ð‘Ò‚¿‚Ü‚·�B�]‚Á‚ÄWDT‚ðŽg—p‚µ‚Ä‚¢‚邯‚«‚ÍUSEŠÖ�”‚ÅRESTART_WDT‚ðƒpƒ‰ƒ��[ƒ^Žw’肵‚Ä‚¨‚­•K—v‚ª‚ ‚è‚Ü‚·�BƒIƒvƒVƒ‡ƒ“ƒpƒ‰ƒ��[ƒ^‚Å '0'‚ðŽw’è‚·‚邯Žó�Mƒf�[ƒ^‚ɑ΂µACK‚ð•Ô�M‚µ‚Ü‚¹‚ñ�B

�s—á�t
i2c_start( ); //start condition
i2c_write(oxa1); //device address
r = i2c_read( ); //read first byte
r2 = i2c_read( ); //read second byte
i2c_stop( ); //stop condition
b=I2C_POLL( ) ‚±‚Ì–½—ß‚Í“à‘ SSPƒ‚ƒWƒ…�[ƒ‹‚ðŽg‚Á‚Ä‚¢‚邯‚«‚¾‚¯—LŒø‚Å‚·�BŽó�Mƒoƒbƒtƒ@‚Ƀf�[ƒ^‚ª“ü‚Á‚Ä‚¢‚鎞TRUE‚ð•Ô‚µ‚Ü‚·�B
TRUE‚ª‚©‚¦‚³‚ꂽ‚ç‚Å‚«‚邾‚¯‘�‚­I2C_READ–½—ß‚ðŽÀ�s‚·‚é•K—v‚ª‚ ‚è‚Ü‚·�B

�s—á�t
ƒ}ƒXƒ^‚ªŽó�M‚·‚é�ê�‡
i2c_start( ); �@�@�@�@�@�@�@�@//start condition
i2c_write(0xc1); �@�@�@�@�@�@�@ //deveice address
count=0;
while(count!=4) {
if(i2c_poll( ) )
�@�@r[count++]= i2c_read( ); //read next
} �@�@�@�@�@�@�@�@�@ //do something here
i2c_stop �@�@�@�@�@�@�@�@ //stop condition

�yƒvƒ�ƒOƒ‰ƒ€‚Ì�ì‚è•û�z

�@I2C’Ê�M‚Í�AŠO•t‚¯‚ÌEEPROM‚âA/D•ÏŠ·‚ȂǂƂ̒Ê�M‚ɂȂé‚Ì‚Å�APIC‚ªƒ}ƒXƒ^
‚ɂȂ邱‚Æ‚ª‘å•”•ª‚Å‚·‚Ì‚Å�Aƒ}ƒXƒ^ƒ‚�[ƒh‚ł̃vƒ�ƒOƒ‰ƒ~ƒ“ƒO•û–@‚ɂ‚¢‚Ä�à–¾
‚µ‚Ü‚·�B
�@‚Ü‚¸�‰Šú‰»‚Å�AI2C’Ê�M‚̃‚�[ƒh�Ý’è‚Ń}ƒXƒ^ƒ‚�[ƒh‚ð�ݒ肵‚Ä‚¨‚«‚Ü‚·�B
‚ ‚Æ‚Í�A’Ê�M‚ðŽn‚ß‚é‚̂͂·‚ׂă}ƒXƒ^‘¤‚©‚ç‚Æ‚È‚è‚Ü‚·�B
ƒ}ƒXƒ^‘¤‚ªƒf�[ƒ^‚ð‘—‚é‚©Žó‚¯‚é‚©‚É‚æ‚Á‚ĉº�}‚̂悤‚Ƀvƒ�ƒOƒ‰ƒ€‚Ì—¬‚ꂪ•Ï‚í
‚è‚Ü‚·�B

�yƒvƒ�ƒOƒ‰ƒ€ŽÀ—á�z

�@CCS CƒRƒ“ƒpƒCƒ‰‚ðŽg‚Á‚ÄŠÈ’P‚È—á‘è‚ð�à–¾‚µ‚Ü‚·�B
‚±‚Ì—á‘è‚Í�A‚Q‚‚ÌPIC‚ÌŠÔ‚ÅI2C’Ê�M‚ðŽg‚Á‚ăf�[ƒ^“]‘—‚ð�s‚¤‚à‚̂ł·�B

(1)‰ñ˜H�\�¬
�@‰ñ˜H‚ð�A‰º�}‚ÉŽ¦‚µ‚Ü‚·‚ª�APIC16F84‚ªI2C‚̃}ƒXƒ^‚ƂȂèƒf�[ƒ^‚ð‘—�M‚·‚邯“¯Žž‚É
‰t�»•\ަŠí‚É‘—�Mƒf�[ƒ^‚ð•\ަ‚µ‚Ü‚·�B
�@‚±‚ê‚ɑ΂µ�AI2C‚Å�Ú‘±‚³‚ꂽPIC16C73‚ªƒXƒŒ�[ƒu‚ƂȂÁ‚ă}ƒXƒ^‚©‚ç‚̃f�[ƒ^‚ðŽó�M
‚·‚邯“¯Žž‚É�A‰t�»•\ަŠí‚ÉŽó�Mƒf�[ƒ^‚ð•\ަ‚µ‚Ü‚·�B
�@‘—�Mƒf�[ƒ^‚Í0x30‚©‚ç0xFD‚܂łð�‡ŽŸ‚WŒÂ‚‚܂Ƃ߂ăuƒ�ƒbƒN“]‘—‚µ‚Ü‚·�B
�]‚Á‚Ä�AI2C’Ê�M‚Å‚Í�AƒAƒhƒŒƒX‚É‘±‚¢‚Ä‚WŒÂ‚̃f�[ƒ^‚ª‘—�M‚³‚ê‚邱‚ƂɂȂè‚Ü‚·�B

�@�@�šI2CƒeƒXƒg‰ñ˜H�}�iƒNƒŠƒbƒN‚µ‚Ä’¼�ÚŒ©‚ç‚ê‚Ü‚·�j


(2)ƒ}ƒXƒ^‘¤ƒvƒ�ƒOƒ‰ƒ€
�@ƒ}ƒXƒ^‚ƂȂé‚Ì‚ÍPIC16F84‚ƂȂè‚Ü‚·�B“–‘RSSPƒ‚ƒWƒ…�[ƒ‹‚Í“à‘ ‚µ‚Ä‚¢‚Ü‚¹‚ñ‚©‚ç�A
ƒvƒ�ƒOƒ‰ƒ€‚ÅI2C‚̃}ƒXƒ^‹@”\‚ðŽÀŒ»‚·‚邱‚ƂɂȂè‚Ü‚·�B
‚Ü‚½�A‰t�»•\ަŠí‚à�Ú‘±‚µ‚Ä•\ަ�§Œä‚ð‚µ‚Ä‚¢‚Ü‚·‚ª�A‚±‚ê‚ɂ̓‰ƒCƒuƒ‰ƒŠ‚ð—˜—p‚µ‚Ä
‚¢‚Ü‚·�B‚±‚̃vƒ�ƒOƒ‰ƒ€‚͉º‹LƒŠƒXƒg‚ƂȂè‚Ü‚·�B

///////////////////////////////////////////////////////
//�@This program is a sample of I2C communication.
//�@This is a master mode program.
//�@This includes next functions.
//�@�@1.Send ASCII code periodically to slave
//�@�@2.Display send datas on LCD display
///////////////////////////////////////////////////////
#include <16f84.h>
#use fast_io(a)
#use delay(CLOCK=10000000)

//////// Port define and link LCD library
#define Bmode 0x0F�@�@�@�@�@�@�@�@//port B initial mode
#define Amode 0�@�@�@�@�@�@�@�@�@ //port A initial mode
#byte db = 6�@�@�@�@�@�@�@�@�@�@�@ //port B

//////// Port define and link LCD library
#define rs�@PIN_A2�@�@�@�@�@�@�@�@//chip select
#define rw�@PIN_A1�@�@�@�@�@�@�@�@//read/write
#define stb PIN_A0�@�@�@�@�@�@�@�@//strobe
#include <lcd_lib.c>�@�@�@�@�@�@�@//LCD library of low byte mode

//////// I2C define
#use I2C(master, sda=PIN_A4, scl=PIN_A3)

/////////////////////////////////////////////////
main(){
�@int�@asci,i;
�@set_tris_a(Amode);�@�@�@�@�@�@//mode set of port
�@set_tris_b(Bmode);�@�@�@�@�@�@//lower is input
�@set_tris_c(0);�@�@�@�@�@�@�@�@//all output
�@lcd_init();�@�@�@�@�@�@�@�@�@ //initialize LCD

�@lcd_data("Start I2C test"); �@//display start message
�@delay_ms(3000);�@�@�@�@�@�@�@ //delay 3sec
�@while(1){�@�@�@�@�@�@�@�@�@�@ //endless loop
�@�@asci=0x30;�@�@�@�@�@�@�@�@ //initial start
�@�@lcd_clear();�@�@�@�@�@�@�@ //display clear
�@�@do {
�@�@�@i2c_start();�@�@�@�@�@�@//start condition
�@�@�@i2c_write(0xa0);�@�@�@�@//address send
�@�@�@for(i=1;i<=8;++i) {
�@�@�@�@i2c_write(asci);�@�@�@//send data 8bytes
�@�@�@�@lcd_data(asci);�@�@�@ //display send data
�@�@�@�@asci=asci+1;
�@�@�@�@delay_us(100);�@�@�@�@//delay 100usec
�@�@�@}
�@�@�@i2c_stop();�@�@�@�@�@�@ //stop condition
�@�@�@delay_ms(1000);�@�@�@�@ //interval 1sec
�@�@}while(asci<0xFE);�@�@�@�@//30 to FD asci code
�@}
}

�y‰ð�à�z
#use I2C(master, sda=PIN_A4, scl=PIN_A3)
�@�@‚±‚±‚ÅI2C‚ðƒ}ƒXƒ^ƒ‚�[ƒh‚ÅSSPƒ‚ƒWƒ…�[ƒ‹–³‚µ‚ÅŽg‚¤‚±‚Æ‚ð�錾
�@�@‚µ‚Ä‚¢‚é�B‚Ü‚½Žg‚¤“ü�o—̓sƒ“‚àŽw’肵‚Ä‚¢‚é�B
i2c_start();
�@�@ƒXƒ^�[ƒgƒRƒ“ƒfƒBƒVƒ‡ƒ“‚̃V�[ƒPƒ“ƒX
i2c_write(0xa0);
�@�@ƒAƒhƒŒƒX‘—�M‚̃V�[ƒPƒ“ƒX
i2c_write(asci);
�@�@ƒf�[ƒ^‘—�M‚̃V�[ƒPƒ“ƒX
i2c_stop();
�@�@ƒXƒgƒbƒvƒRƒ“ƒfƒBƒVƒ‡ƒ“‚̃V�[ƒPƒ“ƒX

(3)ƒXƒŒ�[ƒu‘¤‚̃vƒ�ƒOƒ‰ƒ€—á
�@ƒXƒŒ�[ƒu‘¤‚Í�APIC16C73‚Å�ì�¬‚µ‚Ä‚¢‚Ü‚·‚Ì‚Å�A‚±‚¿‚ç‚ÍSSPƒ‚ƒWƒ…�[ƒ‹‚ð
Žg—p‚µ‚Ü‚·�B
CCS CƒRƒ“ƒpƒCƒ‰‚ł̓XƒŒ�[ƒu‘¤‚É‚ÍSSPƒ‚ƒWƒ…�[ƒ‹‚ª‚ ‚邱‚Æ‚ð‘O’ñ‚É‚µ‚Ä
‚¢‚邿‚¤‚Å‚·�B
SSPƒ‚ƒWƒ…�[ƒ‹‚ðŽg‚¤‚Æ‚¢‚Á‚Ä‚àŠÖ�”�ã‚Í‹æ•Ê‚ª–³‚­�A“¯‚¶Œ`‚̃vƒ�ƒOƒ‰ƒ€‚Æ
‚È‚è‚Ü‚·�B
�@‚±‚±‚ł̃XƒŒ�[ƒu‚ÍŽó�M�ê—p‚ÌŽg‚¢•û‚ɂȂÁ‚Ä‚¢‚Ü‚·�B‚Ü‚½‰t�»•\ަŠí‚É
Žó�Mƒf�[ƒ^‚ð•\ަ‚µ‚Ü‚·‚Ì‚ª�A‚±‚Ì�§Œä‚É‚à‰t�»•\ަŠí—p‚̃‰ƒCƒuƒ‰ƒŠ‚ð
Žg‚Á‚Ä‚¢‚Ü‚·‚ª�Aƒ}ƒXƒ^‘¤‚Ƃ̓sƒ“�Ú‘±‚ªˆÙ‚È‚é‚̂ŕʂ̃‰ƒCƒuƒ‰ƒŠ‚ƂȂÁ‚Ä
‚¢‚Ü‚·�B
‰º‹LƒŠƒXƒg‚ªƒXƒŒ�[ƒu‘¤‚̃vƒ�ƒOƒ‰ƒ€—á‚Æ‚È‚Á‚Ä‚¢‚Ü‚·�B

///////////////////////////////////////////////////////
//�@This program is a sample of I2C communication.
//�@This is a slave mode program.
//�@This includes next functions.
//�@�@1.Receive data from I2C master CPU
//�@�@2.Display received datas on LCD display
///////////////////////////////////////////////////////
#include <16c73.h>
#use fast_io(a)
#use delay(CLOCK=10000000)

//////// Port define and link LCD library
#define Bmode 0xF0�@�@�@�@�@//port B initial mode
#define Amode 0x13�@�@�@�@�@//port A initial mode
#byte db = 6�@�@�@�@�@�@�@�@//port B

#define�@rs�@PIN_A5�@�@�@�@ //chip select
#define rw�@ PIN_A3�@�@�@�@//read/write
#define stb PIN_A2�@�@�@�@//strobe
#include <lcd2_lib.c>�@�@�@//LCD library of low byte mode

/////// I2C define
#use I2C(slave, sda=PIN_C4, scl=PIN_C3, address=0xa0, NOFORCE_SW)

////////////////////////////////////////////
main(){
�@int indata;
�@set_tris_a(Amode);�@�@�@�@//mode set of port
�@set_tris_b(Bmode);�@�@�@�@//lower is input
�@set_tris_c(0x99);
�@lcd_init();�@�@�@�@�@�@�@�@//initialize LCD

�@lcd_data("Start I2C test");�@//display start message
�@while(1){�@�@�@�@�@�@�@�@�@�@�@//endless loop
�@�@if(i2c_poll()){
�@�@�@indata = i2c_read();�@�@�@//get data from I2C
�@�@�@lcd_data(indata);�@�@�@�@�@//display data on LCD
�@�@}
�@}
}


�y‰ð�à�z
#use I2C(slave, sda=PIN_C4, scl=PIN_C3, address=0xa0, NOFORCE_SW)
�@�@‚±‚ê‚ÅI2C’Ê�M‚ðSSPƒ‚ƒWƒ…�[ƒ‹‚ÅŽg—p‚·‚邱‚Æ‚ð�錾‚µ‚Ä‚¢‚é�B“¯Žž‚É
�@�@ƒXƒŒ�[ƒuƒAƒhƒŒƒX‚ÆŽg—p‚·‚é“ü�o—̓sƒ“‚àŽw’肵‚Ä‚¢‚Ü‚·�B
if(i2c_poll()){
�@indata = i2c_read();
�@�@‚±‚±‚Å�AŽó�M‚ªŠ®—¹‚µ‚½‚©‚ðƒ`ƒFƒbƒN‚µ�AŠ®—¹‚µ‚Ä‚¢‚ê‚΃f�[ƒ^‚ð
�@�@“Ç�ž‚݂܂·�B




�@�@�@�@�@�@–ÚŽŸƒy�[ƒW‚Ö