Faits: A. Par jugement du 25 février 2011, le Juge de police de l'arrondissement de la Sarine a condamné X._ pour calomnie à une peine de 80 heures de travail d'intérêt général, avec sursis pendant 2 ans et à payer à Y._ 1000 fr. à titre de réparation du tort moral. B. Par arrêt du 30 mars 2012, la Cour d'appel pénal du Tribunal cantonal fribourgeois a rejeté l'appel formé par X._ et confirmé le jugement de première instance. En résumé, il a été reproché à X._ d'avoir accusé, lors d'une audience devant le juge civil le 16 mai 2007, Y._ d'avoir créé une fausse quittance attestant le paiement par son frère d'un montant de 11'000 fr. à X._ en relation avec la vente du véhicule Jaguar de ce dernier. Dans le cadre de cette vente, une autre quittance à l'entête de la société Z._ AG a été établie pour un montant de 1 fr., dont l'authenticité n'a pas été contestée. Le 20 juillet 2007, Y._ a déposé plainte contre X._ pour calomnie, subsidiairement diffamation. Le 28 novembre 2007, X._ a déposé une dénonciation contre Y._, son frère et le témoin présent lors de la vente du véhicule pour abus de confiance, faux dans les titres et faux témoignage. Dans le cadre de cette enquête, deux expertises ont été ordonnées qui ont abouti à la conclusion que la signature de X._ avait été apposée après l'impression du texte de la quittance et qu'elle n'avait pas été contrefaite. La seconde expertise a relevé que les deux quittances n'avaient très vraisemblablement pas été faites le même jour. Un non-lieu a été prononcé par le juge d'instruction le 10 septembre 2010, confirmé par arrêt de la Chambre pénale du Tribunal cantonal fribourgeois du 17 décembre 2010, qui a constaté que la quittance de 11'000 fr. était authentique, les infractions dénoncées par X._ n'étant ainsi pas réalisées. C. X._ forme un recours en matière pénale contre l'arrêt du 30 mars 2012. Il conclut, sous suite de frais et dépens, à sa réforme en ce sens qu'il est acquitté et que les prétentions civiles de Y._ sont rejetées. Il n'a pas été ordonné d'échange d'écritures.